2015-07-02 56 views
1

使用Knockout組件+ Asp.Net MVC時,下面的代碼片段是一個很好的實踐嗎?任何缺點,我可能會失蹤?通過Razor向Knockout組件注入依賴關係

是使用剃刀服務器端呈現基本上注入KO組件依賴性(主要是初始數據)的一部分...

代碼段:

<my-component params="{ 
    foo: '@Model.FooProperty', 
    bar: '@Model.BarProperty', 
    baz: @Json.Encode(@Model.SomeArray) 
}"> </my-component> 

編輯:

對於避免了@Quango指出的字符串轉義問題,我實現了這個幫助程序:

public static stringEscapeString(this HtmlHelper helper, string value) 
{ 
    return HttpUtility.JavaScriptStringEncode(value, true); 
} 

用法:

<my-component params="{ 
     foo: '@Html.EscapeString(Model.FooString)', ... 
+1

我會謹慎注入字符串值而不使用轉義機制 - 例如如果'Model.FooProperty =「O'Brien」'你會得到一個渲染錯誤。除此之外,唯一的另一種方法是使用viewModel值,這可能不合適(如果值不變) – Quango

+0

@Quango:使用viewModel值的含義是什麼? – Daniel

+0

Knockout可以將'params'部分中的值綁定到文字值(如您的示例中)或在Knockout視圖模型中綁定值(如果存在)。所以傳遞給組件的foo將是一個可觀察的值,組件可以看到更改。我的小提琴頁面上的例子,例如https://jsfiddle.net/Quango/tnphvvgd/ – Quango

回答

0

我們採用淘汰賽在ASP.NET MVC項目在我的工作,也請考慮這個壞習慣。但是這個原因可能不適用於你。這事你必須自己判斷

  • HTML的無緩存(因爲注入的值可能會發生變化)
  • 使用您的JavaScript的HTML的任何捆綁(同上)
  • 混合不同針對同一問題的解決方案可能是不好的做法,尤其是(大型)團隊。本質上,你選擇了Knockout,所以'正常'的做法是獲取你需要的任何JavaScript數據,並在你的視圖中綁定它。如果這是您通常所做的事情,那麼請考慮您是否真的想在這裏創建一個異常,只是因爲數據(據說是)是靜態的。如果這全部是關於節省幾個字節,那麼就想象一下,在一個縮小的包中提供所有的HTML和JavaScript服務,也可以在客戶端緩存。
  • 以後無法覆蓋數據,它本質上是由服務器'硬編碼'。
  • 您的代碼變得不便攜。您的Razor語法基本上將您的前端與您選擇的後端技術耦合在一起。如果這是一個長期項目,請考慮是否可能有一個小的機會,從現在開始的幾年內,您可能會認爲另一個後端技術可能是一個更好的選擇,如果真的有意義,您必須重寫一半前端只是爲了讓這成爲可能。

這些原因都與所有項目無關,因此它在很大程度上取決於上下文。我試圖列出儘可能多的缺點,因爲我可以想到。