如何发送jQuery $ .get以便Model Binder可以将字符串绑定到参数?

我很难让Model Binder工作。 我认为这是jQuery,所以我问了这个问题 ,但经过进一步的调查,我可以看到jQuery确实是将参数发送到服务器。 这就是我提出一个新问题的原因 – 这不再像我原先想的那样是一个jQuery问题。

背景:

我正在做的是向我的Action方法发送一个GET请求,如下所示:

$.get($(this).attr("href"), { "searchExpression": "schroders" }, function (result) { // do stuff }, "html"); 

这会创建以下URL:

HTTP://本地主机:65091 /搜索/标签searchExpression =施罗德

我认为这会有效,并填充了Action方法:

 public PartialViewResult Tabs(string searchExpression) { return PartialView(new SearchViewModel { PagedFunds = _fundService.GetFunds(searchExpression) }); } 

但是这个方法的路线定义为:

 routes.MapRoute( null, "search/{action}/{searchExpression}", new { controller = "search", action = "QuickSearch", searchExpression = "" } ); 

我们可以看到,searchExpression需要作为URL参数,而不是查询字符串参数。 我不认为这会是一个问题,但如果我按如下方式重载Tabs

 public PartialViewResult Tabs(string searchExpression, string query) { return PartialView(new SearchViewModel { PagedFunds = _fundService.GetFunds(searchExpression) }); } 

并改变

 { "searchExpression": "schroders" } 

 { "query": "schroders" } 

填充操作方法中的query参数。

题:

所以我的问题是需要改变什么才能填充searchExpression? 我是否需要修改jQuery,以便将“schroders”附加到URL,所以它就像

 /search/Tabs/schroders 

理想情况下,我可以充分利用两个世界,用户可以使用搜索词键入URL,我也可以使用$ .get,我可以将搜索词作为参数传递给$ .get函数。

看着你的路线。 您已将控制器硬编码为“搜索”,如:

 routes.MapRoute( null, "search/{action}/{searchExpression}", new { controller = "search", action = "QuickSearch", searchExpression = "" } ); 

如果你’软化’这个会发生什么?

 routes.MapRoute( null, "{controller}/{action}/{searchExpression}", new { controller = "search", action = "QuickSearch", searchExpression = UrlParameter.Optional } ); 

此外,从$ .get切换到$ .ajax(post)可能很“有趣”。

只是另一个漫无边际的想法

吉姆

也许我错过了一些东西,但我会建立正常的获取url:

 $.get($(this).attr("href") + "/" + searchTerm, null, function (result) { 

您可以创建一个在使用jQuery搜索时使用的不同操作方法:

 public PartialViewResult JQuerySearchForTabs(string q) { return Tabs(q); } public PartialViewResult Tabs(string searchExpression) { // This goes unchanged } 

然后将您的jQuery调用更改为

 $.get('YourControllerName/JQuerySearchForTabs', { q: "schroders" }, function (result) { // do stuff }, "html"); 

如果你不想硬编码url但是从元素中获取它,请使用一个约定,例如在url末尾的WithAjax ,所以你可以说$(this).attr('href') + 'WithAjax'代表url。

事实certificate我必须指定一个用于不需要searchExpression的标签的路由,所以我的路由配置现在看起来像:

 routes.MapRoute( null, "search/Tabs", new { controller = "search", action = "Tabs" } ); routes.MapRoute( null, "search/{action}/{searchExpression}", new { controller = "search", action = "QuickSearch", searchExpression = "" } );