我的第一步是創建一個視圖模型。即使這與您的實體非常相似,分離也很重要。所以我會創建一個ProductEditViewModel
類。
接下來,根據不同的產品類型確定將要更改的屬性。爲每種產品類型創建單獨的「部分視圖模型」。這使您可以控制顯示哪些屬性以及如何格式化。
在您的主要產品編輯視圖中,根據需要使用switch語句「調換和調出」不同的局部視圖。如果你使用AJAX,你甚至可以動態地做到這一點。
在這個例子中,我們有許多不同的報告具有不同的報告類型。報告的主要部分不會改變,只是一些不同的參數(取決於類型)。
對於每種報告類型,我們都有單獨的部分視圖,您可以看到它們是根據報告類型添加的。此代碼片段位於<% using (Html.BeginForm()) %>
代碼塊內。
<% switch (Model.ReportType)
{
case (int)ReportType.summary:
Html.RenderPartial("Edit/SummaryControl", Model);
break;
case (int)ReportType.exception:
Html.RenderPartial("Edit/ExceptionControl", Model);
break;
case (int)ReportType.leakdetection:
Html.RenderPartial("Edit/LeakDetectionControl", Model);
break;
} %>
和總結報告部分觀點:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Footprint.Web.ViewModels.ReportsEditViewModel>" %>
<fieldset>
<legend>Summary Report Parameters</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.Frequency)%>
</div>
<div class="editor-field">
<%= Html.DropDownListFor(model => model.Frequency,Model.Frequencies) %>
<%= Html.ValidationMessageFor(model => model.Frequency)%>
</div>
<div class="editor-label">
</div>
<div class="editor-field">
<%= Html.CheckBoxFor(model => model.Combine) %><%= Html.LabelFor(model => model.Combine)%>
</div>
</fieldset>
HTH
你是說我應該根據屬性值將ScaffoldColumn設置爲true/false? – 2010-04-29 18:54:18
對不起,如果我不清楚 - 您將此屬性應用於您不希望顯示默認EditorFor幫助器的每個屬性。將其設置爲false將不會顯示該屬性。然後,您可以使用數據註釋自定義輸出。 – Tejs 2010-04-29 20:38:04
我明白了。我的問題(仍然)是:如何渲染一些屬性在渲染屬性根據(視圖)模型的屬性而不同的編輯視圖中? ScaffoldColumn是一種情況下的靜態解決方案。對?屬性的實現方式,它們不允許將函數調用作爲參數(必須是常量表達式)。 否則,做一些類似[ScaffoldColumn(m => ShallShowSpec.IsSatisfiedBy(m))]是可愛的。 如果你仍然認爲你已經解決了這個問題,請提供工作代碼,或以其他方式啓發我。 – 2010-04-29 22:08:30