首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RazorEngine @ helpers工作,但转义

RazorEngine @ helpers工作,但转义
EN

Stack Overflow用户
提问于 2013-10-17 15:47:05
回答 3查看 3K关注 0票数 2

我使用RazorEngine解析网页上html片段中的模板。(这是一个不可能切换到Mvc Razor视图的遗留系统,因此我们将小部分切换到有意义的地方使用RazorEngine )。在SO和互联网上有很多问题,试图让Mvc的Html和Url助手与Razor引擎一起工作。为了使@Html语法正常工作,我修改了一些找到这里的代码,以便将这里添加到基本模板中:

代码语言:javascript
复制
public HtmlHelper<t> Html
{
    get
    {
        if (helper == null) 
        {           
            var writer = this.CurrentWriter; //TemplateBase.CurrentWriter
            var vcontext = new ViewContext() { Writer = writer, ViewData = this.ViewData};

            helper = new HtmlHelper<t>(vcontext, this);
        }
        return helper;
    }
}
public ViewDataDictionary ViewData
{
    get
    {
        if (viewdata == null)
        {

            viewdata = new ViewDataDictionary();
            viewdata.TemplateInfo = new TemplateInfo() { HtmlFieldPrefix = string.Empty };

            if (this.Model != null)
            {
                viewdata.Model = Model;
            }

        }

    return viewdata;
    }
    set
    {
        viewdata = value;
    }
}

在对Html源代码进行了大量调试之后,我想我已经成功地实例化了helper所需的所有内容,并且成功地为@Html.Label运行了.问题是,生成的html是:

代码语言:javascript
复制
&lt;label for=&quot;MyNumber&quot;&gt;MyNumber&lt;/label&gt;

显然应该是:

代码语言:javascript
复制
<label for="MyNumber">MyNumber</label>

我很困惑如何解决这个问题。在查看RazorEngine源代码时,我无法找到编码是如何发生的。我最初的想法是,TextWriter必须对值进行编码,但我无法证实这一点。如何让@Html.BlahFor()呈现未转义的html?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-17 17:19:23

我已经找到了解决我所面临的问题的办法。RazorEngine的基本模板将自动编码一个字符串(或对象),如果它不强制转换为一个IEncodedString。在我的例子中,我通过在模板类中重写WriteTo方法来解决这个问题:

代码语言:javascript
复制
public override void WriteTo(TextWriter writer, object value)
{
    if (writer == null)
        throw new ArgumentNullException("writer");

    if (value == null) return;

    var encodedString = value as IEncodedString;
    if (encodedString != null)
    {
        writer.Write(encodedString);
    }
    else
    {
        var htmlString = value as IHtmlString;
        if(htmlString != null) 
            writer.Write(htmlString.ToHtmlString());
        else
        {
            //This was the base template's implementation:
            encodedString = TemplateService.EncodedStringFactory.CreateEncodedString(value);
            writer.Write(encodedString);
        }
    }
}

我还没有看到这种改变是否会导致任何错误,但是现在我发现了这个方法以后应该比较容易改变。

编辑:选中以查看helpers返回实现IHtmlString的MvcHtmlString,因此通过向该接口添加强制转换,我们可以避免对帮助程序返回的Html进行编码,同时对此方法的任何其他调用者仍然具有安全性。

票数 2
EN

Stack Overflow用户

发布于 2016-02-17 09:37:56

Antaris是RazorEngine的作者,它提供了另一种处理此问题的有趣方法,并解释了为什么默认情况下不这样做(以尽可能减少RazorEngine依赖)。

这是你的案子,他的关于相应的github问题的答复的相关部分

我认为这里最容易做的事情是实现一个处理MvcHtmlString的自定义MvcHtmlString。类似于: 公共类MvcHtmlStringFactory : IEncodedStringFactory { public IEncodedString CreateEncodedString(string rawString) {返回新的HtmlEncodedString(rawString);} public IEncodedString CreateEncodedString(object obj) { if (obj == null)返回新的HtmlEncodedString(string.Empty);var htmlString = obj作为HtmlEncodedString;if (htmlString = null)返回htmlString;var mvcHtmlString = obj作为htmlString;if (htmlString= null)返回新的();返回新的(());}公共MvcHtmlStringWrapper : IEncodedString {私有只读MvcHtmlString _value;公共MvcHtmlStringWrapper(MvcHtmlString值){ _value =值;}公共字符串ToEncodedString() {返回_value.ToString();}公共覆盖字符串ToString() {返回ToEncodedString();}} 这将使现有的MvcHtmlString实例能够绕过RazorEngine内置的编码机制。这不会是基本库的一部分,因为我们不考虑任何对System.WebSystem.Web.Mvc的依赖。 您需要通过您的配置将其连接起来: var config =新TemplateServiceConfiguration() { BaseTemplateType = typeof(MvcTemplateBase<>),EncodedStringFactory =新MvcHtmlStringFactory() };

就我个人而言,在使用MvcHtmlString代码之前,我已经将IHtmlString转换为IHtmlString。从MVC 5开始,MvcHtmlString也实现了它。(请注意,在一些较旧的MVC版本中,情况并非如此。)

票数 2
EN

Stack Overflow用户

发布于 2015-08-07 09:20:09

感谢您的启发,我将数据存储在xml中,并在不覆盖WriteTo方法的情况下创建了不同的解决方案。我使用了一个继承自TemplateBase的类,并创建了两个新方法。

代码语言:javascript
复制
    public IEncodedString HtmlOf(NBrightInfo info, String xpath)
    {
        var strOut = info.GetXmlProperty(xpath);
        strOut = System.Web.HttpUtility.HtmlDecode(strOut);
        return new RawString(strOut);
    }

    public IEncodedString BreakOf(NBrightInfo info, String xpath)
    {
        var strOut = info.GetXmlProperty(xpath);
        strOut = System.Web.HttpUtility.HtmlEncode(strOut);
        strOut = strOut.Replace(Environment.NewLine, "<br/>");
        strOut = strOut.Replace("\t", "&nbsp;&nbsp;&nbsp;");
        strOut = strOut.Replace("'", "&apos;");
        return new RawString(strOut);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19431365

复制
相关文章

相似问题

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