【问题标题】:Use querystring variables in MVC controller在 MVC 控制器中使用查询字符串变量
【发布时间】:2012-07-14 08:27:58
【问题描述】:

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

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

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

【问题讨论】:

  • 这个问题似乎很模糊。您需要提及您正在使用的框架/语言。
  • 对不起,我在上面更正了。

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


【解决方案1】:
public ActionResult SomeAction(string start, string end)

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

【讨论】:

  • 我已经尝试过了,但从未分配过参数。我不知道查询字符串参数是 unixtimestamps 是否重要,但是当我尝试这种方法时,double 和 sting 都没有任何值。
  • 这个方法对我有用。重要的是要注意变量名称必须完全匹配。
  • 如果路由配置中的参数有默认值,这个默认值会覆盖查询字符串值。
  • 在 MVC 术语中,这是唯一正确的方法。如果它不适合您,请确保变量名称与您的查询参数名称完全匹配。如果它仍然不适合您,请转到您的 RouteConfig.cs 并查看您的路线 - 可能那里配置不正确。
  • 找到我的答案,是的
【解决方案2】:

我想通了……终于在上面找到了另一个article

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

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

【讨论】:

  • 就如何在 MVC 中完成而言,只是说这是错误的。检查 Maess 的正确答案。
  • 这就像试图弄清楚如何解决一个 Rubics 立方体,最后,您只需将贴纸撕掉,然后将它们放回已解决的位置。
  • 这更像是把魔方称为魔方。它可能不是首选方法,也不是最常学习的方法,但它取得了成果,现在开始解决更大更好的问题。无论如何,我用它来检索一个 URLEncoded url 重定向路径,该路径在嵌入 url 时会产生错误。我不确定这是否是首选方式,但我也为在我生命中的某个时刻从 Rubix 立方体上撕下贴纸而感到内疚。继续……
  • 您很可能希望在控制器中执行此操作,而不会错过 MVC 的要点。
  • 是的,我有一种情况,我希望查询字符串键是可变的(用户可以执行“?max=true”或“?maximum=true”),在这种情况下是标准 MVC 变量名在控制器方法中似乎对我没有帮助,因为我只能选择一个。这个答案似乎是这个用例的解决方案
【解决方案3】:

Davids,我遇到了和你一样的问题。 MVC 并不直观,而且在他们设计它时,孩子们似乎并不了解直观的 MVC 查询字符串系统的目的或重要性。

根本没有在路由中设置查询字符串(RouteConfig)。它们是控制器中操作的附加“额外”参数。这非常令人困惑,因为 Action 参数旨在处理路径和查询字符串。如果您添加了参数但它们不起作用,请为查询字符串添加第二个,如下所示:

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

public ActionResult Hello(int id)

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

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

假设“id”在RouteConfig.cs 文件。

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

我自己也觉得这非常令人困惑,所以你并不孤单!他们应该设计了一种简单的方法来为 RouteConfig 文件配置设计中的特定命名字符串、任何查询字符串名称和任意数量的查询字符串添加查询字符串路由。如果不这样做,它会使 MVC Web 应用程序中查询字符串的整个使用成为问题,这很奇怪,因为自 1990 年代中期以来,查询字符串一直是万维网的稳定部分。 :(

【讨论】:

    【解决方案4】:

    这是我想出的。我在这方面遇到了重大问题,并且相信我现在处于 MVC 6 中,但这可能对将来的某个人甚至我自己都有帮助..

    //问题是 Reqest.Form Request.Querystring 和 Request 在 MVC 中不起作用,解决方案是使用 Context.Request.Form 并确保表单已提交,否则会出现空引用或上下文问题错误.

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

    【讨论】:

      【解决方案5】:

      我的问题是用默认值覆盖了我的查询字符串参数:

      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} 
      

      两者都可以正常工作。

      【讨论】:

        【解决方案6】:

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

        我关注了这个帖子How to get Request Querystring values?

        编辑: 在尝试过滤容器后,我收到了奇怪的错误消息。转到我的项目属性后,我取消选中了优化代码复选框,该复选框发生了变化,突然间,我的控制器中的参数从我想要的 url 中填充了。

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

        【讨论】:

          猜你喜欢
          • 2013-07-29
          • 2017-03-02
          • 1970-01-01
          • 2017-11-12
          • 1970-01-01
          • 2018-02-02
          • 1970-01-01
          • 1970-01-01
          • 2017-03-23
          相关资源
          最近更新 更多