Подтвердить что ты не робот

Проблемы с помощником Url.Action с несколькими значениями маршрута

В настоящее время я разрабатываю приложение ASP.NET MVC3 в VS2010, и у меня возникают проблемы с помощником @Url.Action. У меня есть запрос ajax, где я использую этот помощник:

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })';
$.post(url).success(function(data) { 
    ... 
});

Проблема в том, что после /Controller/Action?a=a&b=b значение url, обратите внимание на & между значениями маршрута. Это не работает, но если я это сделаю:

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })'.replace('amp;', '');

он отлично работает!!!

Мое действие - это примерно так:

public JsonResult Action(string a, string b) 
{
    ...
}

Я отлаживал свое приложение, и действие вызывается, и даже a есть "a", но b есть null.

Является ли это желаемым поведением Url.Action? Я так не думаю. Пожалуйста, помогите мне, что я делаю неправильно? Должен ли я добавить еще один параметр в мой вызов Url.Action? Спасибо заранее.

4b9b3361

Ответ 1

Это не ты. Javascript идентифицирует & как защищенный символ и "кодирует его"

Вы нашли один способ обойти это, я видел других. Поскольку этот вопрос НЕ задает наилучший способ, но независимо от того, являетесь ли вы им, я могу заверить вас, что он НЕ ВАС. Вы ничего плохого не сделали. Это естественное поведение Javascript.

Если мы обсудим наилучший подход, я предпочитаю использовать @Url.Action только для получения моего URL-адреса и передать параметры в качестве параметров для моего метода JQuery (метод .Ajax - мой любимый).

пример, заимствованный из e.camper

$.post(url, { a: "a", b: "b"}).success(...)

Ответ 2

Проблема заключается в том, что при использовании синтаксиса бритвы: @... механизм бритвы кодирует результат Url.Action(который является строкой) как MvcHtmlString. Это приводит к тому, что амперсанды кодируются как &. Чтобы обойти это, используйте Html.Raw (Возвращает разметку, которая не закодирована в HTML.)

var url = '@Html.Raw(Url.Action("Action", "Controller", new { a = "a", b = "b" }))';

В результате: '/Controller/Action? a = a & b = b'

Спасибо @GSerg (см. комментарий в ответ Дэйва Альперовича)... но желаемым результатом является не кодировка javascript. Использование HttpUtility.JavaScriptStringEncode("&") приводит к '\ u0026'

Ответ 3

каждая вещь, указанная в приведенном выше ответе, велика, я хочу добавить что-то к тому, как вы отправляете запрос ajax, когда вы хотите отправить дополнительные данные, отправьте его как

var url = '@Url.Action("Action", "Controler")';
$.post(url,{a:'a',b:'b'}).success(function(data) { 
    ... 
});

Ответ 4

Как я уже упоминал в своем комментарии, это проблема с кодировкой JavaScript. Лучший способ избежать необходимости выполнять UrlDecoding или замену символов - это определить маршрут, который соответствует параметрам, которые вы пытаетесь передать

routes.MapRoute(
            "MyCustomRoute",
            "{Controller}/{Action}/{a}/{b}",
            new {controller = "Controller", action = "Action"}

Поместите это в свой файл global.asax выше вашего маршрута по умолчанию. Теперь, когда вы вызываете

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })';

Выход будет /Controller/Action/a/b

Ответ 5

Я знаю, что это старый вопрос, но у меня была аналогичная проблема, поэтому я заканчиваю это:

$.ajax({
        type: "Post",
        url: "@Url.Action("Action", "Controller")",
        data:{ param1 : "@Model.param1", param2 : "@Model.param2", param3:"@Model.param3",......,param20 : "something" },
        success: function (response) {
            $("#yourDiv").html(response);
       }
    });

Я надеюсь, что это может быть полезно для кого-то другого.