Встроенный метод для кодирования амперсандов в URL, возвращенных из Url.Action? - PullRequest
7 голосов
/ 24 мая 2010

Я использую Url.Action для создания URL-адреса с двумя параметрами запроса на сайте со строгим форматом XHTML.

Url.Action("ActionName", "ControllerName", new { paramA="1" paramB="2" })

генерирует:

/ControllerName/ActionName/?paramA=1&paramB=2

но он мне нужен для генерации URL с экранированным амперсандом:

/ControllerName/ActionName/?paramA=1&paramB=2

Тот факт, что Url.Action возвращает URL с амперсандом, а не экранированный, нарушает мою проверку HTML. Мое текущее решение состоит в том, чтобы просто вручную заменить амперсанд в URL-адресе, возвращенном из Url.Action, на экранированный амперсанд. Есть встроенное или лучшее решение этой проблемы?

Ответы [ 4 ]

7 голосов
/ 12 июня 2012

Это сработало для меня:

Html.Raw(Url.Action("ActionName", "ControllerName", new { paramA="1" paramB="2" }))
1 голос
/ 25 мая 2010

Любая причина, по которой вы не можете использовать Server.HtmlEncode ()

string EncodedUrl = Server.HtmlEncode(Url.Action("Action", "Controller", new {paramA = "1", paramB = "2"}));

http://msdn.microsoft.com/en-us/library/w3te6wfz.aspx

0 голосов
/ 11 марта 2011

У вас возникла проблема с отображением URL, а не с генерацией URL.URL может содержать не закодированный амперсанд, и есть места, которые могут быть именно тем, что вам нужно.Однако HTML-код, в который вы его встраиваете, требует кодирования амперсандов и различных других символов.

Хотя вспомогательный метод позволяет сэкономить некоторую типизацию в представлениях, я всегда нахожу, что он избавляет от головной боли при использовании любой кодировки дисплеясделано в самый последний момент, поэтому я всегда работаю с подлинной строкой / URL вплоть до того момента, когда мне нужно манипулировать ею для использования в определенном выходном формате.Если вы добавите вспомогательное расширение из вашего ответа в HtmlHelper, у вас будет меньше соблазнов преждевременно кодировать URL-адрес до того, как он действительно понадобится.

Чтобы перевести его в HTML:

// with MVC3 auto-encoding goodness
<%:Url.Action(...)%>
// old-school MVC
<%=Html.Encode(Url.Action(...))%>

Чтобы поместить его в атрибут anchor / src непосредственно в представлении, вы, вероятно, можете избежать использования Html.Encode или менее строгого параметра:

<%=Html.AttributeEncode(Url.Action(...))%>
0 голосов
/ 02 июня 2010

В итоге я просто создал расширения для Url.Action под названием Url.ActionEncoded. Код выглядит следующим образом:

namespace System.Web.Mvc {
    public static class UrlHelperExtension {
        public static string ActionEncoded(this UrlHelper helper, StpLibrary.RouteObject customLinkObject) {
            return HttpUtility.HtmlEncode(helper.Action(customLinkObject.Action, customLinkObject.Controller, customLinkObject.Routes));
        }
        public static string ActionEncoded(this UrlHelper helper, string action) {
            return HttpUtility.HtmlEncode(helper.Action(action));
        }
        public static string ActionEncoded(this UrlHelper helper, string action, object routeValues) {
            return HttpUtility.HtmlEncode(helper.Action(action, routeValues));
        }
        public static string ActionEncoded(this UrlHelper helper, string action, string controller, object routeValues) {
            return HttpUtility.HtmlEncode(helper.Action(action, controller, routeValues));
        }
    }
}
...