2013-03-15 3 views
12

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

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

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

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? Заранее спасибо.

+0

Я не думаю, что это проблема с Url.Action, а jQuery HTML, кодирующая ваш URL. – Tommy

ответ

3

Это не вы. Javascript идентифицирует & как защищенный характер и «кодирует его»

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

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

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

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

, так что вы бы сделали что-то вроде этого: 'var url = '@ Url.Action (« Action »,« Controler »)';', а затем '$ .post (url, {a:" a ", b:" b «}). успех (...)' ?? – ecampver

+0

@ e.campver, да, это отличный пример –

+2

Мне не нравится опровергать * это НЕ ВАШ * бит, но на самом деле вы @ecampver - вы генерируете значения для строк JS, это должно быть сделано правильно: 'var url = '@ HttpUtility.JavaScriptStringEncode (Url.Action («Действие», «Контроллер», новый {a = "a", b = "b"}))'; '. Также неверно, что * Javascript идентифицирует & * - это движок Razor, который выводит результат 'Url.Action', который представляет собой строку в отличие от' MvcHtmlString', поэтому он кодируется в точке генерации ответа HTML. Чтобы предотвратить использование этого метода, используйте 'Html.Raw', но поскольку мы генерируем строку JS, мы используем' JavaScriptStringEncode'. – GSerg

2

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

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

+0

Это сообщение ajax, делает ли ASP.NET MVC3 коллекцию маршрутов для отображения этого типа URL? ? – ecampver

+1

Каждый раз, когда вы вызываете помощника Url, MVC запускает это через таблицу маршрутизации и пытается совпадение. В вашем примере кажется, что вы передаете свои параметры, являются частью URL-адреса, а не в фактической форме POST (это нормально, и ничего плохого в том, чтобы сделать это таким образом, если вы передаете простые элементы обратно контроллеру). – Tommy

+0

+1 @Tommy много благодарен, не знаю, я буду помнить об этом;) – ecampver

3

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

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

проверить мой комментарий в принятом ответе, спасибо в любом случае, я дам вам +1;) – ecampver

+0

ах, если бы я видел это раньше, никогда бы не ответил ... – dakait

0

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

$.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); 
     } 
    }); 

Надеюсь, это может быть полезно для кого-то еще.

4

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

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

Результирующее в:?/Controller/Action = а & Ь = Ь '

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

 Смежные вопросы

  • Нет связанных вопросов^_^