2010-04-29 62 views
0

在C#4,ASP.NET MVC 2和NHibernate的上下文中,我有以下情况:在编辑视图中显示视图模型属性的不同子集

让我们假设一个实体ProductProductType有关联。

在产品编辑视图中;我该如何实现只有产品属性的子集以典雅和干爽的方式基于ProductType关联显示?即,对于ProductType的属性的不同值应显示不同的属性。

使用产品视图模型构建器,并从不同的视图模型自动生成我自己的视图Html.EditorForModel()(包括下拉菜单和其他东西不是现成的)?

属性是一个视图模型的属性,并使用前面提到的Html.EditorForModel()方式?

使用一个模型,但实现不同的网页控件(视图策略)(它可以做干吗?)?

完全是另一回事吗?

回答

0

我查看了所有的答案,并通过更彻底地想这个问题。我有办法去像

使用产品视图模型构建,并 从不同的视图模型 自动地与 生成视图我自己Html.EditorForModel() (包括下拉菜单和其他的东西 不盒子外面)?

从我原来的问题。

我有一个视图模型创建器,它需要一个相应的领域模型实体的实例,以及来自领域模型的不同列表以用于下拉菜单。

取而代之使用EditorFor/EditorForModel开箱即用,我根据Brad Wilson的想法described in this post制作了自己的自定义模板。 (尽管我希望我有一次以上的动态语言,以减少代码并摆脱一些反射......)。

0

您可以使用EditorForModel且仅当您添加的属性的属性的子集得到显示有:

[ScaffoldColumn(false)] 

要你不希望显示的属性。当然,如果您实现自己的自定义编辑器模板,那么您完全可以控制HTML被呈现的内容。

+0

你是说我应该根据属性值将ScaffoldColumn设置为true/false? – 2010-04-29 18:54:18

+0

对不起,如果我不清楚 - 您将此属性应用于您不希望显示默认EditorFor帮助器的每个属性。将其设置为false将不会显示该属性。然后,您可以使用数据注释自定义输出。 – Tejs 2010-04-29 20:38:04

+0

我明白了。我的问题(仍然)是:如何渲染一些属性在渲染属性根据(视图)模型的属性而不同的编辑视图中? ScaffoldColumn是一种情况下的静态解决方案。对?属性的实现方式,它们不允许将函数调用作为参数(必须是常量表达式)。 否则,做一些类似[ScaffoldColumn(m => ShallShowSpec.IsSatisfiedBy(m))]是可爱的。 如果你仍然认为你已经解决了这个问题,请提供工作代码,或以其他方式启发我。 – 2010-04-29 22:08:30

1

啊我看到了 - 我的歉意。这不是'技术上'支持的 - 但是,您可以改变自定义属性以使用一些时髦的反射来实现相同的目的。这绝对不是最佳做法。

另一种选择是使用Html.EditorFor(m => m.ProduceView()),其中ProduceView是一种根据属性状态返回新的ViewModel类型的方法 - 所以如果设置了某个Property,那么ProduceView将发送一个SetPropertyViewModel或一个NotSetPropertyViewModel,它们都实现了一些基类或接口。这些视图模型中的每一个都可以用不同的注释。

+0

+1为您的见解。 – 2010-05-05 07:20:41

0

创建将ProductType作为参数的自定义DataAnnotationAttribute。然后应用到要查看的相应属性。您可以通过为产品创建EditorTemplate来进一步扩展此功能,该EditorTemplate将处理进一步的过程,表单元素的外观和感觉,或者某些表单元素的某些JQuery。

1

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

+0

+1了解您的见解。 – 2010-05-05 07:21:35