代码之家  ›  专栏  ›  技术社区  ›  DaveDev

如何发送jquery$.get以便模型绑定器可以将字符串绑定到参数?

  •  0
  • DaveDev  · 技术社区  · 14 年前

    我很难让模型活页夹工作。我以为是jquery,所以我问 this question 但在进一步调查之后,我可以看到jquery确实在向服务器发送参数。这就是我问一个新问题的原因——这不再是一个jquery问题,正如我最初认为的那样。

    背景:

    我要做的是向我的操作方法发送一个GET请求,如下所示:

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

    这将创建以下URL:

    http://localhost:65091/search/Tabs?searchExpression=schroders

    我认为这是可行的,并填充了操作方法:

    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 将填充action方法中的参数。

    问题:

    所以我的问题是,为了填充searchExpression,需要更改什么?我是否需要修改jquery,以便它将“schroders”附加到url,因此

    /search/Tabs/schroders
    

    理想情况下,我可以拥有两个世界中最好的,在这里用户可以用搜索词键入URL,我也可以使用$.get,以一种我可以将搜索词作为参数传递给$.get函数的方式。

    4 回复  |  直到 14 年前
        1
  •  1
  •   jim tollan    14 年前

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

    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)可能很有趣。

    只是又一个漫无目的的想法……

    吉姆

        2
  •  1
  •   mattk    14 年前

    也许我遗漏了一些东西,但我只需要构建普通的get url:

    $.get($(this).attr("href") + "/" + searchTerm, null, function (result) {
    
        3
  •  0
  •   Tomas Aschan    14 年前

    您可以创建一个不同的操作方法,在使用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,而是从元素中获取它,请使用惯例,例如tucking on WithAjax 在URL的末尾,所以你可以说 $(this).attr('href') + 'WithAjax' 对于URL。

        4
  •  0
  •   DaveDev    14 年前

    结果是我必须指定一个路径,用于不需要的选项卡 searchExpression ,因此我的路由配置现在看起来如下:

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