在MVC控制器中使用查询字符串变量

63

我是C#.net MVC的新手,正在尝试将 FullCalendar 添加到MVC应用程序中。

FullCalendar脚本会自动将?start={}&end={}添加到URL中...这很好,但我不知道如何在控制器中使用querystring变量。

我在WebForms应用程序中使用的方法不起作用。我需要在控制器中添加什么来访问querystring变量?


问题似乎不够明确。您需要提及您正在使用的框架/语言。 - pyrometer
1
抱歉,我已经在上面进行了更正。 - davids
请查看此链接:http://www.codingfusion.com/Post/Use-querystring-variables-in-Asp-Net-MVC-controller - undefined
6个回答

94
public ActionResult SomeAction(string start, string end)

该框架将把查询字符串参数映射到方法参数。


2
我之前已经尝试过了,但是参数从来没有被分配。我不知道这个是否重要,因为查询字符串参数是Unix时间戳,但是当我尝试这种方法时,双精度和字符串都没有任何值。 - davids
2
这个方法对我有效。需要注意的是变量名必须完全匹配。 - Eric K
1
如果路由配置参数有默认值,则该默认值将覆盖查询字符串的值。 - Tomas Kubes
1
在MVC术语中,这是唯一正确的方法。如果它对您不起作用,请确保变量名称与查询参数名称完全匹配。如果仍然无法正常工作,请转到您的RouteConfig.cs并查看您的路由 - 可能有些配置不正确。 - Illidan
找到了我的答案,是的它会。 - nuander

77

我明白了...终于在另一个文章上找到了答案。

string start = Request.QueryString["start"];

string end = Request.QueryString["end"];

27
仅仅说这是错误的,从MVC的角度来看应该如何完成。请查看Maess的答案,那是正确的。 - Dan
10
这就像尝试解决魔方一样,最后你只是把贴纸剥下来,然后重新贴回到正确的位置。 - Christine
20
这更像是把魔方称作“Rubics cube”。这可能不是首选的方法,也不是最常用的方法,但它达到了预期的效果,现在我们正在解决更大更好的问题。无论如何,我用它来检索一个URLEncoded的URL重定向路径,在嵌入URL时会产生错误。我不确定这是否是首选的方法,但我也曾在生命中某个时刻剥去魔方上的贴纸。继续前进... - wavedrop
11
在控制器中执行此操作而不错过MVC的重点是完全可能的。 - Don Rolling
2
是的,我有一个情况,我希望查询字符串键是可变的(用户可能会使用“?max=true”或“?maximum=true”)。在这种情况下,控制器方法中的标准MVC变量名称似乎对我没有帮助,因为我只能选择一个。这个答案似乎是这种用例的解决方案。 - PandaWood
显示剩余4条评论

4

达维德,我和你遇到了完全相同的问题。MVC并不直观,而且似乎在设计时,那些孩子们没有理解为MVC设计一个直观的查询字符串系统的目的或重要性。

查询字符串根本没有设置在路由(RouteConfig)中。它们是添加到控制器中动作的“额外”参数。这非常令人困惑,因为操作参数被设计为同时处理路径和查询字符串。如果您添加了参数但它们无效,请添加第二个参数来处理查询字符串:

以下是您的控制器类中捕获ID(实际上只是在RouteConfig文件中设置为典型默认路径的路径)的操作:

public ActionResult Hello(int id)

但是,要捕获查询字符串,您的控制器需要添加一个额外的参数(顺便说一下,这个参数在您的RouteConfig文件中没有设置):

public ActionResult Hello(int id, string start, string end)

现在,它监听"/Hello?start=&end="或者"/Hello/?start=&end="或者"/Hello/45?start=&end=",假设"RouteConfig.cs"文件中的"id"设置为可选。

如果您想在"RouteConfig"文件中创建一个没有"id"路径的"自定义路由",则可以在该文件中省略"id"或其他参数。在这种情况下,您控制器中的Action方法中的参数将只处理查询字符串。

我发现这个非常令人困惑,所以你并不孤单!他们应该设计一种简单的方式来添加查询字符串路由,包括特定命名字符串、任何查询字符串名称和RouteConfig文件配置设计中的任意数量的查询字符串。由于没有这样做,它使得MVC Web应用程序中使用查询字符串整个过程都具有疑问,这相当奇怪,因为查询字符串自上世纪90年代中期以来就是全球网络的稳定部分。 :(


1
这是我想到的解决方案。在此之前,我遇到了很大的问题,但现在我相信我已经进入了MVC 6,这可能对某些人甚至是我自己在未来有所帮助。
//问题在于,在MVC中,Reqest.Form、Request.Querystring和Request无法正常工作,解决方法是使用Context.Request.Form,并确保表单已提交,否则将出现空引用或上下文问题错误。
     if(Context.Request.ContentLength != null)
     {
         String StartDate = Context.Request.Form["StartMonth"].ToString();
         String EndMonth = Context.Request.Form["EndMonth"].ToString();
        // Vendor

     }

1
我的问题是使用默认值覆盖了查询字符串参数:
routes.MapRoute(
    "apiRoute", 
    "api/{action}/{key}", 
    new { controller = "Api", action = "Prices", key = ""}
);

无论我在查询字符串中输入什么,或者只使用key="",结果都是一样的。
然后使用UrlParameter.Optional来消除默认覆盖:
routes.MapRoute(
    "apiRoute", 
    "api/{action}/{key}", 
    new { controller = "Api", action = "Prices", key = UrlParameter.Optional }
);

现在。
prices/{key} 

或者

prices?key={key} 

两个都可以正常工作。


0

我在从ApiController继承而不是常规Controller类时遇到了这个问题。我通过使用 var container = Request.GetQueryNameValuePairs().ToLookup(x => x.Key, x => x.Value); 解决了它。

我遵循了这个线程 如何获取请求查询字符串的值?

编辑: 在尝试筛选容器后,我收到了奇怪的错误消息。在转到我的项目属性后,我取消了Optimize Code复选框,这样,我的控制器中的所有参数都从我想要的url中填充了起来。

希望这能帮助有同样问题的人.


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