ASP.NET MVC-获取QueryString值


76

在ASP.NET MVC下,您应该像在ASP.NET WebForms中一样使用QueryString参数吗?还是[AcceptVerbs(HttpVerbs.Get)]声明以某种方式被使用?

Answers:


120

只需在操作上使用一个参数即可接受查询字符串参数-即

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

它将接受类似的查询 .../someroute?someValue=abc&someOtherValue=123

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


这样可以防止查询字符串攻击吗?像任何脚本注入?
Hamza Khanzada

在这种情况下,“ someroute”是什么?
伊戈尔·梅萨罗斯

32

我想你要找的是

Request.QueryString["QueryStringName"]

您可以通过添加以下内容在视图上访问它 @

现在来看我的示例,我用QueryString生成了一个网址

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

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

什么时候queryString是空的

listURL的值为 /Sector/List


25

您总是可以Request.QueryString像Web表单一样使用集合,但是也可以使MVC处理它们并将它们作为参数传递。这是建议的方法,因为它更简单,并且将自动验证输入数据类型。


7

我建议使用控制器的ValueProvider属性,这与UpdateModel / TryUpdateModel的提取方式非常相似,以提取所需的路由,查询和表单参数。这将使您的方法签名可能不会变得非常大并经常更改。由于您可以在单元测试期间向控制器提供ValueProvider,这也使测试变得更加容易。


1

实际上,您可以通过两种方式捕获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

不要问我为什么他们会这样设计。如果它们为单个查询字符串抛出整个Controller操作系统,并且只是通过url-form-encoding返回URL的所有字符串/已编码文件对象的捕获动态列表,则它们会更有意义,因此您可以在一个调用中轻松访问它们。也许有人可以证明这一点吗?

对我而言,Controller如何捕获查询字符串毫无意义,但这确实意味着您比捕获查询字符串更灵活地捕获查询字符串。所以选择你的毒药。。。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.