C # Mvc ajax baseUrl - PullRequest
       3

C # Mvc ajax baseUrl

2 голосов
/ 10 июня 2019

Итак,

У меня есть приложение, которое использует MVC Areas.Маршрут для контроллера выглядит как

[Route("Settings/{something}")]

Тогда у меня есть действие

  [Route("suggest/{term}")]
  public ActionResult Suggest(string something, string term).

Я пытаюсь вызвать действие Suggest из javascript

var suggestUri = "suggest/";
$searchInput.autocomplete({
    source: function (request, response) {
        $.ajax({
            type: "GET",
            url: suggestUri + request.term,
            dataType: "json",
            success: function (data) {
                response(data);
            },
            error: function (err) {
                console.log(err);
            }
        });
    },
    minLength: 3
});

Из моегос этой точки зрения этот URL-адрес вызова ajax должен быть

 http://localhost:7311/Settings/firstValue/suggest/term

Но фактический результат -

 http://localhost:7311/Settings/suggest/term

Отсутствует {something}

.сделать неправильно, но я понятия не имею, что.

LE: Я провел несколько тестов.

Если я применяю к своему контроллеру другой маршрут, например

[Route ("Настройки / {что-то} / a")]

Результат

 http://localhost:7311/Settings/firstValue/suggest/term

Когда это должно быть

http://localhost:7311/Settings/firstValue/a/suggest/term

Затем я попытался сделать

[Route("Settings/{something}/a/b")]

Результат:

 http://localhost:7311/Settings/firstValue/a/suggest/term

Когда это должно быть

http://localhost:7311/Settings/firstValue/a/b/suggest/term

Такое ощущение, что mvc всегда пропускает последний параметр из моего контроллера.Любая причина?

LE2:

В Startup.cs MapRoute выглядит следующим образом

  app.UseMvc(routes =>
            {
                routes.MapRoute(
               name: "somethingBased",
               template: "{area:exists}/{somethingBased?}/{controller=Home}/{action=Index}");

                routes.MapRoute(
                    name: "home",
                    template: "{controller=Home}/{action=Index}/{application?}");

            });

1 Ответ

3 голосов
/ 11 июня 2019

Предполагая, что вы визуализируете свой javascript в представлении Razor, вы всегда можете использовать @Url.Action для вычисления URL, а не пытаться вычислить его из javascript.

$searchInput.autocomplete({
    source: function (request, response) {
        $.ajax({
            type: "GET",
            url: @Json.Serialize(Url.Action("Suggest", new { term = '$TERM$' })).replace('$TERM$', request.term),
            dataType: "json",
            success: function (data) {
                response(data);
            },
            error: function (err) {
                console.log(err);
            }
        });
    },
    minLength: 3
});

Это использует Url.Action("Suggest", new { term = '$TERM$' }) длярассчитать шаблон на стороне вашего сервера маршрутизации MVC, который возвращает Settings/firstValue/suggest/$TERM$.Затем @Json.Serialize преобразует это в литерал javascript "Settings/firstValue/suggest/$TERM$".

В javascript, вы string.replace $TERM$ с вашим динамическим значением.Javascript, представленный бритвой, будет выглядеть следующим образом:

url: "Settings/firstValue/suggest/$TERM$".replace("$TERM$", request.term)

Преимущество этого подхода состоит в том, что если вы позже измените свою маршрутизацию в MVC, код на стороне клиента все еще будет работать.

Если вам нужно указать значения контроллера, области или другого маршрута, которые не могут быть выведены из текущего контекста, Url.Action имеет множество перегрузок для обработки этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...