2011-07-28 48 views
0

我想用BegingForm与Get方法,这是我做的查询字符串从BeginForm在MVC 3

@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到服务器是一样的东西

主页/搜索?查询=“嗒嗒” & QUERY2 =“嗒嗒” & query3 =“blah”

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

此外,如果我的BeginForm的内容可以更改,并且查询字符串参数名称可能因呈现的页面而异,但我希望有一个Search方法可以分析查询字符串并执行正确的操作?

此外,是他们的方式来查询参数来进入一个字典?

回答

1

显然,即将到来的URL到服务器是一样的东西 主页/搜索?查询= “嗒嗒” & QUERY2 = “嗒嗒” & QUERY3 = “嗒嗒”

那怎么HTML <form>与方法GET的工作,这与ASP.NET MVC无关,它是纯HTML。你不能做这种事,不是有你的控制器动作等是这样的:

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

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

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

+0

你是说mvc框架可以自动将我的查询字符串反序列化为SearchViewModel吗?我是否需要装饰SearchViewModel来实现这一点?你能否请我介绍一下如何将查询字符串映射到SearchViewModel的文档? – iCode

+0

@Mike Dotnet,是的,这就是默认的模型绑定器所做的。你不必装饰任何东西。您只需确保此模型中的属性名称与您的HTML'

'中的输入字段的名称相对应。但是,当然,如果您使用强类型助手(如“Html.TextBoxFor”)并传递一个lambda表达式来生成这些输入字段,框架将负责正确命名它们,以便您不必担心它。 –

0

如果你想从查询字符串中的项目,只需使用从ControllerBase“请求”对象:

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”就如你想:)

字典
+0

太棒了!这也很有用。 – iCode