ASP.NET MVC - 获取QueryString的值

83
在ASP.NET MVC中,您是否应该像在ASP.NET WebForms中一样获取QueryString参数?还是 [AcceptVerbs(HttpVerbs.Get)]声明会以某种方式被使用?
7个回答

141

可以通过在操作中使用参数来接受查询字符串参数-即

public ActionResult Foo(string someValue, int someOtherValue) {...}

可以接受像.../someroute?someValue=abc&someOtherValue=123这样的查询。

除此之外,您可以直接查看请求以获得更多控制。


这会防止查询字符串攻击吗?比如脚本注入? - Hamza Khanzada
在这种情况下,“someroute”是什么? - Igor Meszaros

43

我认为您正在寻找的是

Request.QueryString["QueryStringName"]

你可以在视图中添加@来访问它

现在看看我的例子,我使用 QueryString 生成了一个 Url

 var listURL = '@Url.RouteUrl(new { controller = "Sector", action = "List" , name = Request.QueryString["name"]})';

listURL的值为/Sector/List?name=value

queryString为空时,listURL的值为/Sector/List


26

你可以像Web Forms那样始终使用Request.QueryString集合,但你也可以让MVC处理它们并将它们作为参数传递。这是建议的方式,因为它更简单,并且它会自动验证输入数据类型。


8

我建议使用控制器的ValueProvider属性,就像UpdateModel / TryUpdateModel一样,提取所需的路由,查询和表单参数。这将使您的方法签名不会因潜在增长而变得非常庞大,并且受到频繁更改的影响。这也使得测试变得更容易,因为您可以在单元测试期间向控制器提供ValueProvider。


6

实际上,你可以用两种方式在MVC中捕获查询字符串......

public ActionResult CrazyMVC(string knownQuerystring)
{

  // This is the known query string captured by the Controller Action Method parameter above
  string myKnownQuerystring = knownQuerystring;

  // This is what I call the mysterious "unknown" query string
  // It is not known because the Controller isn't capturing it
  string myUnknownQuerystring = Request.QueryString["unknownQuerystring"];

  return Content(myKnownQuerystring + " - " + myUnknownQuerystring);

}

这将捕获两个查询字符串...例如:

/CrazyMVC?knownQuerystring=123&unknownQuerystring=456

Output: 123 - 456

不要问我为什么他们设计了这样的方式。如果他们放弃整个控制器动作系统,转而返回通过URL进行url-form-encoding的所有字符串/编码文件对象的捕获动态列表,并使其可以在一次调用中轻松访问,那将更有意义。也许这里有人可以演示一下是否可能?对于控制器如何捕获查询字符串我感到困惑,但这确实意味着您比他们默认教授的更具灵活性。所以选择你的毒药...两者都很好用。

2

这是在.NET 6(和其他netcore)中的正确方式

var Param = Request.Query["IndexString"];

如果需要字符串

string Param = Request.Query["IndexString"].ToString();


2

@Context.Request.Query["yourId"]


@Context.Request.QueryString["yourId"] 确切地说是 https://learn.microsoft.com/zh-cn/dotnet/api/system.web.httprequestbase?view=netframework-4.8 - Serg Shevchenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接