来自MVC 3中BeginForm的查询字符串

时间:2011-07-28 22:20:30

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

我想使用BegingForm和Get方法,这就是我的工作

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

}

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

}

但查询字符串总是返回null。我想,我需要做一些路线,但没有运气

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

显然,即将到来的服务器网址就像是

主页/搜索查询= “等等” &安培; QUERY2 = “等等” &安培; QUERY3 = “嗒嗒”

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

此外,如果我的BeginForm的内容可以更改,因此查询字符串参数名称可能会有所不同,具体取决于呈现的页面,但我想要一个分析查询字符串并执行正确操作的搜索方法?

另外,他们是否可以查询参数进入字典?

2 个答案:

答案 0 :(得分:1)

  

显然,即将到来的服务器网址是这样的   主页/搜索查询= “等等” &安培; QUERY2 = “等等” &安培; QUERY3 = “嗒嗒”

这就是带有GET方法的HTML <form>如何工作,这与ASP.NET MVC无关,它是纯HTML。除了让控制器操作看起来像这样之外,你无法做很多事情:

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

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

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

答案 1 :(得分:0)

如果要从查询字符串中获取项目,只需使用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”就是你想要的字典:)