2011-11-01 30 views
0

我有模型類,它們具有複雜類型(即其他模型類)的屬性項。當我從Visual Studio自動生成視圖時,如何才能做到這一點,這些類(包含在頂級類中)是否顯示得當?如何讓ASP.NET MVC 3在自動生成的視圖中呈現具有複雜類型的對象?

基本上,我如何更新http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html到ASP.NET MVC 3?

TIA,
班吉

+0

是的,你是對的,謝謝 - 我只是錯過了那部分。如果您將該答案作爲答案提交,我會將其標記爲正確...謝謝。 – benjy

回答

1

你問升級到剃刀語法?否則它應該仍然在mvc 3中工作。只需將您的代碼放入視圖/共享/編輯器模板/對象.ascx中即可。

4

來吧,自己做一點努力,告訴您遇到了什麼困難!否則你如何期望學習一些東西?

Views/Home/Index.cshtml

@model SampleModel 
<h3>Details</h3> 
<fieldset style="padding: 1em; margin: 0; border: solid 1px #999;"> 
    @Html.DisplayForModel() 
</fieldset> 
<p>@Html.ActionLink("Edit", "Edit")</p> 

Views/Home/Edit.cshtml

@model SampleModel 
<h3>Edit</h3> 
@using (Html.BeginForm()) 
{ 
    <fieldset style="padding: 1em; margin: 0; border: solid 1px #999;"> 
     @Html.ValidationSummary("Broken stuff:") 
     @Html.EditorForModel() 
     <input type="submit" value=" Submit " /> 
    </fieldset> 
} 
<p>@Html.ActionLink("Details", "Index")</p> 

Views/Shared/DisplayTemplates/Object.cshtml

@model object 
@if (Model == null) 
{ 
    @ViewData.ModelMetadata.NullDisplayText 
} 
else if (ViewData.TemplateInfo.TemplateDepth > 1) 
{ 
    @ViewData.ModelMetadata.SimpleDisplayText 
} 
else 
{ 
    <table cellpadding="0" cellspacing="0" border="0"> 
    @foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))) 
    { 
     if (prop.HideSurroundingHtml) 
     { 
      @Html.Display(prop.PropertyName) 
     } 
     else 
     { 
      <tr> 
       <td> 
        <div class="display-label" style="text-align: right;"> 
         @prop.GetDisplayName() 
        </div> 
       </td> 
       <td> 
        <div class="display-field"> 
         @Html.Display(prop.PropertyName) 
        </div> 
       </td> 
      </tr> 
     } 
    } 
    </table> 
} 

Views/Shared/EditorTemplates/Object.cshtml

@model object 
@if (ViewData.TemplateInfo.TemplateDepth > 1) 
{ 
    @ViewData.ModelMetadata.SimpleDisplayText 
} 
else 
{ 
    <table cellpadding="0" cellspacing="0" border="0"> 
    @foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) 
    { 
     if (prop.HideSurroundingHtml) 
     { 
      @Html.Editor(prop.PropertyName) 
     } 
     else 
     { 
      <tr> 
       <td> 
        <div class="editor-label" style="text-align: right;"> 
         @(prop.IsRequired ? "*" : "") 
         @Html.Label(prop.PropertyName) 
        </div> 
       </td> 
       <td> 
        <div class="editor-field"> 
         @Html.Editor(prop.PropertyName) 
         @Html.ValidationMessage(prop.PropertyName, "*") 
        </div> 
       </td> 
      </tr> 
     } 
    } 
    </table> 
} 
+0

這似乎引入了一個錯誤,其中名稱與「ViewBag」或「ViewData」屬性匹配的viewmodel屬性被覆蓋。例如,名爲'Title'的屬性將被頁面標題覆蓋。 – Sam

1

比方說你有一個返回的對象,如

public class Product 
{ 
    public int ProductId { get; set; } 
    public string Description { get; set; } 
    public List<Detail> Details { get; set; } 
} 

的名單,那麼你想生成使用此模型的視圖屬性視圖模型。這裏是你的操作方法

public ViewResult Edit(int productId) 
{ 
    Product product = contextDB.Products.FirstOrDefault(p => p.ProductId == productId); 

    return View("Edit", product); 
} 

生成的代碼將看起來像這樣(不完全)

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>MyViewModel</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ProductId) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.ProductId) 
      @Html.ValidationMessageFor(model => model.ProductId) 
     </div> 

    ... 
    <fieldset> 
} 

生成的代碼將不包括在默認情況下列表屬性的任何代碼。 Razor視圖引擎代碼生成器只與模型的屬性一樣深。您可以編寫訪問視圖中「詳細信息」列表的代碼,但它必須是自定義代碼。

+0

如何編寫該代碼來顯示包含所有後代的整個屬性樹? – Shimmy

+1

你將不得不遍歷所有的屬性和嵌入對象與他們自己的屬性或嵌入對象的列表及其屬性在視圖內。如果您希望在模型中嵌入模型,您可能希望將嵌入模型作爲局部視圖的模型。我絕對不會在視圖中放置很多C#代碼來遍歷嵌入式模型。 –

+0

謝謝。現在就開始工作。 – Shimmy

相關問題