【问题标题】:Query String from BeginForm in MVC 3从 MVC 3 中的 BeginForm 查询字符串
【发布时间】:2011-07-28 22:20:30
【问题描述】:

我想将 BegingForm 与 Get 方法一起使用,这就是我所做的

@using (Html.BeginForm("Search","Home",FormMethod.Get))
{ 
   //My input elements

}

public class HomeController : Controller
{
    public ActionResult Search(string queryString)
    {
    }

}

但查询字符串总是返回为空。我想,我需要对路线做点什么,但没有运气

routes.MapRoute(
            "SearchRoute", // Route name
            "Home/Search{queryString}", // URL with parameters
            new { controller = "Home", action = "Search", filter = UrlParameter.Optional } // Parameter defaults
            );

显然,到达服务器的 url 类似于

首页/搜索?query="blah"&query2="blah"&query3="blah"

我做错了什么?当我想将 get 与 beginform 一起使用时,在控制器中获取查询参数的正确方法是什么?

另外,如果我的 BeginForm 的内容可以更改,因此查询字符串参数名称可能会根据呈现的页面而有所不同,但我想要一种搜索​​方法来分析查询字符串并做正确的事情?

另外,他们是否有一种方法可以查询参数以进入字典?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    显然,到达服务器的 url 类似于 主页/搜索?query="blah"&query2="blah"&query3="blah"

    这就是带有方法 GET 的 HTML <form> 的工作原理,这与 ASP.NET MVC 无关,它是纯 HTML。除了让你的控制器动作看起来像这样之外,你无能为力:

    public ActionResult Search(SearchViewModel model)
    {
        ...
    }
    

    SearchViewModel 将包含此表单上每个输入字段的属性。你也不需要这个SearchRoute,因为它不会那样工作。

    这就是说你可能会使用 javascript 来订阅表单的 onsubmit 事件,取消默认提交(它展示了你当前正在观察的行为),手动获取表单中的所有值,然后手动生成你想要的 url 并使用window.location.href = '....'; 重定向到它。我只是为了完整性而提到这一点,但绝对不是我推荐或您应该做的事情。

    【讨论】:

    • 你是说mvc框架可以自动反序列化我的查询字符串到SearchViewModel?我是否需要以任何方式装饰 SearchViewModel 才能实现这一点?您能否请我参考有关如何将查询字符串映射到 SearchViewModel 的任何文档?
    • @Mike Dotnet,是的,这就是默认模型绑定器所做的。你不必装饰任何东西。您只需确保此模型上的属性名称与 HTML <form> 中的输入字段名称相对应。当然,如果您使用强类型帮助器(例如 Html.TextBoxFor)并传递 lambda 表达式来生成这些输入字段,框架将负责正确命名它们,因此您不必担心。
    【解决方案2】:

    如果要从查询字符串中获取项目,只需使用 ControllerBase 中的“Request”对象即可:

        public ActionResult Search()
        {
             var queries = new List<string>();
             foreach (var parameter in Request.QueryString)
             {
                 queries.Add(parameter.ToString());
             }
             //Do Stuff with the query parameters...
             return View("Index");
        }
    

    而“Request.QueryString”就是你想要的字典 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多