我的第一步是创建一个视图模型。即使这与您的实体非常相似,分离也很重要。所以我会创建一个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