如何发送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 = "" } );