Проблемы с помощником 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
? Спасибо заранее.
Ответы
Ответ 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);
}
});
Я надеюсь, что это может быть полезно для кого-то другого.