2010-04-29 102 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