2011-01-11 71 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>