2011-01-11 83 views
8

我们在典型的MVC流程之外使用Razor。我们的Razor视图是在XSL转换中通过C#扩展调用的。 Razor视图的输出以字符串形式返回到xsl转换。在某些情况下,我们将Razor视图的结果捕获到一个xsl变量中,然后将其传回到我们的模型中,作为另一个Razor视图中的数据使用。当发生这种情况时,我们最终将第一个视图进行双重编码,一次由Razor进行,第二次通过xsl转换进行编码。我们需要能够运行Razor而不需要对输出进行编码。如何禁用整个剃须刀视图的HTML编码

这可能吗?我们将如何去做呢?

+2

不是完整的答案,但是你可以使用@(新HtmlString(Model.Something))或@ Html.Raw(Model.Something)来绕过编码。 – jhexp 2011-01-11 17:26:11

+0

谢谢。我很喜欢使用视图中可用的编码功能。在这种情况下,我将视图引擎的输出返回到另一个进程,并且需要阻止引擎在整个视图上执行的编码。它不仅仅是在视图中嵌入一些编码数据的问题。我明白这不是一个标准的实现。在我们的案例中,我们有一个遗留系统,它具有很多向后兼容性约束,我们正在尝试实现现代化。如果成功,以这种方式使用Razor将允许我们在一两年内迁移到MVC。感谢您的输入。 – gidmanma 2011-01-11 17:34:30

回答

14

既然你想在你的整个视图禁用编码,你最好的选择是创建你自己的观点基类WebPageBase继承(然后你的意见应该使用@inherits指定新类型),并覆盖Write(object value)方法,以便它改为调用WriteLiteral()。这样输出将不会被编码。

5

而且在该answer above你会做到这一点,像这样:

public abstract class TextBasedViewPage : System.Web.Mvc.WebViewPage 
{ 
    public override void Write(object value) 
    { 
     WriteLiteral(value); 
    } 
} 

public abstract class TextBasedViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel> 
{ 
    public override void Write(object value) 
    { 
     WriteLiteral(value); 
    } 
} 

然后在您的视图中,可以下手了:

@inherits MyNamespace.TextBasedViewPage<MyModelNamespace.Model>