2012-01-11 42 views
0

我有一個局部視圖,有時需要收集數據,有時只需要顯示保存的數據並且不允許編輯。創建一個包含元素,其屬性可以影響子元素的呈現方式

我想爲這兩種需求使用相同的局部視圖,因爲格式很複雜。但是,我不想僅將「禁用」標記應用於特定控件:我希望(在服務器端)將只讀數據呈現爲文本而不是控件,以便它不能被回發。

(徵求意見,使事情複雜化,有一個字段,可編輯,即使是隻讀的所有其他領域,所以會有一個回)。

我正在考慮這個問題的一般解決方案。做最簡單的事情將是下面的代碼模式適用於所有領域:

@{ if(condition) { 
    @Html.TextBoxFor(model=>model.Field) 
} 
else 
{ 
    @Html.DisplayFor(model=>model.Field) 
} 
} 

但是,這是不雅的,並可能導致難以閱讀的代碼。而且,由於模式必須手動應用,因此很容易出錯。

我正在寫一些擴展方法來補充TextBoxFor等,它將採用一個額外的參數來指示是否調用TextBoxFor或DisplayFor。

但我希望更好的是我可以設置一個包含的元素,它會自動影響子元素的呈現方式,您可以在ASP.NET WebForms Panel控件上設置Visible屬性的方式。

所以現在我正在走進假設領域。爲了實現這樣的事情,我需要一個包含服務器端的元素(可能遵循與BeginForm相同的模式),它已經意識到它自己的範圍,並且可能會影響包含渲染擴展調用的方式。

這樣的事情甚至可能嗎?

+3

爲什麼不只是創建兩個單獨的視圖? – 2012-01-11 21:29:08

+0

@Shark因爲視圖足夠複雜,格式足夠複雜,所以我不想創建兩件必須保持同步的東西。但是,謝謝你:一般來說這可能是最好的解決方案。 – 2012-01-13 16:30:19

回答

0

我不是真的推薦這一點,但你可以做這樣的事情:

public static MvcHtmlString Ternary<TModel, TValue>(this HtmlHelper<TModel> html, bool test, Expression<Func<TModel, TValue>> expression, Func<Expression<Func<TModel, TValue>>, MvcHtmlString> truthy, Func<Expression<Func<TModel, TValue>>, MvcHtmlString> falsey) 
    { 
     return ((test) ? truthy : falsey).Invoke(expression); 
    } 

,然後用它是這樣的:

@Html.Ternary(condition, x => x.Field, Html.TextBoxFor, Html.DisplayFor)); 

獨立意見,像鯊魚說,真的可能是正確的路要走。

+0

謝謝!這是一個有趣的方法! (但是我同意你的看法,更多的意見是獨立的,但我發現保羅的迴應,下面非常有趣。) – 2012-01-13 16:34:22

相關問題