Как отправить jQuery $ .get, чтобы связыватель модели мог связать строку с параметром? - PullRequest
0 голосов
/ 29 июля 2010

У меня проблемы с тем, чтобы заставить работать модель Binder. Я подумал, что это jQuery, поэтому я задал этот вопрос , но после дальнейшего изучения я вижу, что 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 в методе действия.

Вопрос:

Итак, мой вопрос: что нужно изменить, чтобы заполнить searchExpression? Нужно ли мне изменять jQuery, чтобы он добавлял «шредеры» к URL, так что это похоже на

/search/Tabs/schroders

В идеале я мог бы иметь лучшее из обоих миров, где пользователь мог бы ввести URL с поисковым термином, и я мог бы также использовать $ .get таким образом, чтобы я мог передать поисковый термин в качестве параметра в $ Функция .get.

Ответы [ 4 ]

1 голос
/ 29 июля 2010

Возможно, я что-то упустил, но я бы просто создал нормальный URL-адрес get:

$.get($(this).attr("href") + "/" + searchTerm, null, function (result) {
1 голос
/ 29 июля 2010

глядя на ваш маршрут.у вас есть контроллер, закодированный как 'search', как в:

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).

просто еще одна бессвязная мысль ..

jim

0 голосов
/ 29 июля 2010

Оказывается, мне пришлось указать маршрут для вкладок, которым не нужно searchExpression, поэтому моя конфигурация маршрутизации теперь выглядит следующим образом:

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

routes.MapRoute(
    null,
    "search/{action}/{searchExpression}",
    new { controller = "search", action = "QuickSearch", searchExpression = "" }
    );
0 голосов
/ 29 июля 2010

Вы можете просто создать другой метод действия, который вы используете при поиске с помощью 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-адрес, а получаете его от элемента, используйте соглашение, например, добавляя WithAjax в конце URL-адреса, так что вы можете сказать $(this).attr('href') + 'WithAjax' для URL-адреса .

...