首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >停止标记构建器转义单引号ASP.NET MVC 2

停止标记构建器转义单引号ASP.NET MVC 2
EN

Stack Overflow用户
提问于 2010-10-13 22:39:58
回答 4查看 7.5K关注 0票数 16

我有以下HtmlHelper方法,我想要创建一个使用JavaScript执行重定向的按钮:

代码语言:javascript
复制
public static string JavaScriptButton(this HtmlHelper helper, string value,
                        string action, string controller, object routeValues = null, object htmlAttributes = null)
{
    var a = (new UrlHelper(helper.ViewContext.RequestContext))
                            .Action(action, controller, routeValues);

    var builder = new TagBuilder("input");
    builder.Attributes.Add("type", "submit");
    builder.Attributes.Add("value", value);
    builder.Attributes.Add("class", "button");
    builder.Attributes.Add("onclick", string.Format("javascript:location.href='{0}'", a));
    builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

    return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing)).ToString();         
}

问题是创建onclick处理程序的代码行被标记构建器转义,得到的html是:

代码语言:javascript
复制
<input class="button" onclick="javascript:location.href=&#39;&#39;" type="submit" value="Return to All Audits" />

有什么办法可以让我停止这种行为吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-13 23:35:29

这实际上是.NET 4.0的一个问题。要修复它,您需要覆盖属性编码过程。

代码语言:javascript
复制
public class HtmlAttributeNoEncoding : System.Web.Util.HttpEncoder
{
    protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output)
    {
        output.Write(value);
    }
}

然后将其放入<system.web>元素下的web.config文件中:

代码语言:javascript
复制
<httpRuntime encoderType="HtmlAttributeNoEncoding"/>

我找到了这个here

票数 14
EN

Stack Overflow用户

发布于 2013-07-11 00:46:40

虽然Ryan提供的解决方案可能有效,但它有点像用锤子拍打苍蝇。

问题在于,在调用MergeAttributes()期间,TagBuilder会对字符串进行编码。对于按钮链接中所需的Javascript,这会影响单引号和空格。

所需扩展方法的最后一步是返回MvcHtmlString (不接收进一步的编码),因此在创建该对象之前对字符串进行一些简单的文本更正(撤消编码)是完全合理的。

例如:

代码语言:javascript
复制
return new MvcHtmlString(tb.ToString(TagRenderMode.Normal).Replace("&#39;", "\'").Replace("&#32;"," "));

一个完整的ActionLinkButton助手如下所示:

代码语言:javascript
复制
public static class ActionLinkButtonHelper
{
    public static MvcHtmlString ActionLinkButton(this HtmlHelper htmlHelper, string buttonText, string actionName, object routeValuesObject = null, object htmlAttributes = null)
    {
        return ActionLinkButton(htmlHelper, buttonText, actionName, "", routeValuesObject, htmlAttributes);
    }
    public static MvcHtmlString ActionLinkButton(this HtmlHelper htmlHelper, string buttonText, string actionName, string controllerName, object routeValuesObject = null, object htmlAttributes = null)
    {
        if (string.IsNullOrEmpty(controllerName))
        {
            controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
        }
        RouteValueDictionary routeValues = new RouteValueDictionary(routeValuesObject);
        RouteValueDictionary htmlAttr = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        TagBuilder tb = new TagBuilder("button");
        tb.MergeAttributes(htmlAttr, false);
        string href = UrlHelper.GenerateUrl("default", actionName, controllerName, routeValues, RouteTable.Routes, htmlHelper.ViewContext.RequestContext, false);

        tb.MergeAttribute("type", "button");
        tb.SetInnerText(buttonText);
        tb.MergeAttribute("value", buttonText);
        tb.MergeAttribute("onclick", "location.href=\'"+ href +"\';return false;");
        return new MvcHtmlString(tb.ToString(TagRenderMode.Normal).Replace("&#39;", "\'").Replace("&#32;"," "));
    }
}

这将完成添加按钮链接所需的所有操作,具有与ActionLink一起使用的最有用的重载,并且不会因为更改属性编码过程而潜在地导致应用程序范围内的意外更改。

票数 9
EN

Stack Overflow用户

发布于 2015-05-23 16:36:25

MergeAttribute期间,TagBuilder不会对字符串进行编码,因为它直接操作Attributes属性,然后使用ToString()获取字符串表示也会转义字符。编码很可能是在ToString()期间进行的。

下面的类用JavaScript解决了这个问题:

代码语言:javascript
复制
public class JavaScriptTagBuilder : TagBuilder
{
    public string OnClick { get; set; }

    public JavaScriptTagBuilder(string tagName)
        : base(tagName)
    {
    }

    public override string ToString()
    {
        string openingTag = "<" + TagName;
        return base.ToString().Replace(openingTag, string.Format("{0} onclick=\"{1}\"", openingTag, OnClick));
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3924861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档