我正在使用Url.Action在文档类型为XHTML严格的网站上生成包含两个查询参数的网址。
Url.Action("ActionName", "ControllerName", new { paramA="1" paramB="2" })
产生
/ControllerName/ActionName/?paramA=1¶mB=2
但我需要它来生成带有&符号转义的网址:
/ControllerName/ActionName/?paramA=1&paramB=2
Url.Action返回带有&符号未转义的网址这一事实会破坏我的HTML验证。我目前的解决方案是只使用转义的&符号手动替换Url.Action返回的URL中的&符号。是否有内置或更好的解决方案来解决这个问题?
答案 0 :(得分:7)
这对我有用:
Html.Raw(Url.Action("ActionName", "ControllerName", new { paramA="1" paramB="2" }))
答案 1 :(得分:1)
您无法使用Server.HtmlEncode()
的任何原因string EncodedUrl = Server.HtmlEncode(Url.Action("Action", "Controller", new {paramA = "1", paramB = "2"}));
答案 2 :(得分:0)
我最终只为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));
}
}
}
答案 3 :(得分:0)
您似乎遇到了呈现网址的问题,而不是网址的生成问题。 URL中可以包含未编码的&符号,并且有些地方可能正是您所需要的。但是,在这种情况下,您要嵌入的HTML需要&符号和各种其他字符编码。
虽然帮助方法可以在视图中保存一些输入,但我总是发现在最后一刻可以完成任何显示编码,因此我总是使用真正的字符串/ URL,直到我需要它为止它被操纵以用于特定的输出格式。如果你在HtmlHelper中放置来自your answer的帮助扩展名,那么在实际需要之前,你就不会过早地对你的URL进行编码。
将其原始化为HTML:
// with MVC3 auto-encoding goodness
<%:Url.Action(...)%>
// old-school MVC
<%=Html.Encode(Url.Action(...))%>
要直接在视图中将它放在一个anchor / src属性中,你可能会使用Html.Encode
或更少严格的选项:
<%=Html.AttributeEncode(Url.Action(...))%>