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

时间:2012-07-14 23:43:08

标签: c# asp.net-mvc query-string

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

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

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

6 个答案:

答案 0 :(得分:82)

public ActionResult SomeAction(string start, string end)

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

答案 1 :(得分:71)

我想通了......终于找到了另一个article

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

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

答案 2 :(得分:2)

戴维斯,我和你有完全相同的问题。 MVC并不直观,看起来当他们设计它时,kiddos并不了解直观查询系统对MVC的目的或重要性。

根本没有在路径中设置查询字符串(RouteConfig)。它们是附加的"额外的" Controller中Actions的参数。这非常令人困惑,因为Action参数旨在处理BOTH路径和Querystrings。如果您添加了参数并且它们不起作用,请为查询字符串添加第二个参数:

这将是您在Controller类中捕获ID的操作(实际上它只是在RouteConfig文件中设置的路径,作为MVC中的典型默认路径):

public ActionResult Hello(int id)

但是为了捕获查询字符串,需要在Controller中添加一个额外的参数(顺便说一句,这不是在RouteConfig文件中设置的):

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

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

如果你想创建一个"自定义路线"在RouteConfig文件中没有" id"路径,你可以放弃" id"或该文件中的操作后的其他参数。在这种情况下,控制器中Action方法中的参数只会处理查询字符串。

我发现自己非常困惑,所以你并不孤单!他们应该设计一种简单的方法来为RouteConfig文件配置设计中的特定命名字符串,任何查询字符串名称和任意数量的查询字符串添加查询字符串路由。通过不这样做,它使MVC Web应用程序中的查询字符串的整体使用成为可疑的,这是非常奇怪的,因为自20世纪90年代中期以来,查询字符串一直是万维网的稳定部分。 :(

答案 3 :(得分: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} 

两者都很好。

答案 4 :(得分:0)

这是我想出的。我遇到了很多重大问题,并且相信我现在处于MVC 6中,但这对未来的某人甚至可能有帮助。

//问题是Reqest.Form Request.Querystring和Request在MVC中不起作用的解决方案是使用Context.Request.Form并确保表单已经提交,否则将显示null引用或上下文问题bug

     if(Context.Request.ContentLength != null)
     {
         String StartDate = Context.Request.Form["StartMonth"].ToString();
         String EndMonth = Context.Request.Form["EndMonth"].ToString();
        // Vendor

     }

答案 5 :(得分:0)

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

解决了这个问题

我关注了此线程How to get Request Querystring values?

编辑: 尝试对容器进行过滤后,我收到了奇怪的错误消息。转到项目属性后,我取消选中“优化代码”复选框,该复选框已更改,因此突然我的控制器中的参数就根据需要从URL中填满了。

希望这会帮助遇到相同问题的人。