我一直在使用剃刀引擎 了幾天,現在,我很喜歡它 很多。我從一開始就注意到一個大問題 ,所有字符串都是HTML 編碼。對於我們的用途,當我們 處理JSON字符串時,這變成了一個令人討厭的「功能」 。例如, 給出一個簡單的JSON字符串[ 「1」, 「2」, 「3」, 「4」]
實際HTML此 的編碼輸出成爲,[, , ,]
引號已經逃脫,這是 不期望的輸出。如果我們需要將 發回HTML或XML,我們會 必須再單獨轉義 那些。總體而言,我覺得這相當不利,因爲我們不得不將 包裝在HtmlString中,如 這個StackOverflow帖子所示。
在我們的場景中,我們生成從C# JSON/XML,所以大部分的時間,我們 序列化的數據是 視圖模型內。這將導致我們 做這樣的事情,@(新 HtmlString(View.Foo))@(新 HtmlString(View.Bar))
正如你所看到的,這可以成爲相當 繁瑣。所以我決定 抄襲MVC的一部分來創建一個 RawView。最後,使用將 是,@ RawView.Foo @ RawView.Bar
我也說幹就幹,允許索引操作符的使用 以及萬一 有需要遍歷其與 密鑰列表。 //假設我們有Foo, Bar和Baz在我們的ViewModel @ { List keys = new List {「Foo」,「Bar」,「Baz」}; 的foreach(在密鑰VAR鍵){ @RawView [關鍵] }}
要做到這一點,我需要 重複DynamicViewDataDictionary。 當然,我將其命名爲 DynamicRawViewDataDictionary,public class DynamicRawViewDataDictionary: DynamicObject { private private readonly Func viewThunk; public DynamicRawViewDataDictionary(Func viewThunk) this.viewThunk = viewThunk; }
private ViewDataDictionary ViewData
{
get
{
ViewDataDictionary viewData = this.viewThunk();
return viewData;
}
}
public object this[string key]
{
set { setData(key, value); }
get { return getData(key); }
}
public override IEnumerable<string>
GetDynamicMemberNames() { 返回ViewData.Keys; }
public override bool TryGetMember(GetMemberBinder binder,
出對象結果) { 結果=的getData(binder.Name); 返回true; }
public override bool TrySetMember(SetMemberBinder binder,
對象值) { 使用setData(binder.Name,值); 返回true; }
private object getData(string key)
{
object value = ViewData[key];
if (value is string)
{
return new HtmlString(value.ToString());
}
return value;
}
private void setData(string key, object value)
{
ViewData[key] = value;
}
}
的原因複製是 因爲DynamicViewDataDictionary 是一個內部密封類。有 沒辦法,我可以繞過此複製 限制和 粘貼。我對 這個類做出的明顯改變是getData方法。我檢查 以查看該對象是否爲 字符串,如果是,則用 HtmlString()將其包裝。
現在我需要使用這個 WebViewPage內,因爲所有的意見,我有 有 WebViewPage的定製版本,以及。好東西 MS沒有讓這個班級內部的 密封起來,所以我可以很容易地從 繼承下來。我需要做一個通用的和非通用的版本,我只是把這個內部的 一個文件。 public abstract class CustomWebViewPage: WebViewPage private DynamicRawViewDataDictionary _rawData; 公共動態RawView { 得到 { 如果(_rawData == NULL){ _rawData =新DynamicRawViewDataDictionary(()=> ViewData的); } return _rawData; } } }
public abstract class CustomWebViewPage : WebViewPage
{
private DynamicRawViewDataDictionary _rawData;
public dynamic RawView
{
get
{
if (_rawData == null)
{
_rawData = new DynamicRawViewDataDictionary(() =>
ViewData的); } return _rawData; }} }
對於最終的觸摸真正讓 這項工作,在CSHTML 文件的頂部,你應該有類似的東西, @inherits Namespace.To.CustomWebViewPage
//或@inherits Namespace.To.CustomWebViewPage
既然CSHTML文件從 繼承新CustomWebViewPage,應該 訪問RawView,whic h將 用HtmlString包裝所有字符串。
一旦你有這個地方,你會 仍然需要確保你的新視圖的所有 繼承自 CustomWebViewPage。我強烈推薦使用 在您的 MVC項目中使用自定義代碼模板來生成視圖。這個 將幫助自動化很多的日常任務。
該方法實際上並未顯示它在調試器中返回編碼字符串,只是視圖以這種方式寫入。 – brooks 2010-11-24 21:01:35