使用ViewModel强制键入的视图不会自动生成字段

问题描述:

当我创建视图并将其直接绑定到具有要显示在视图上的属性的类时,字段(文本框等)为自动创建。但是,当我创建一个ViewModel封装多个对象与数据,这不会发生。有没有办法让ViewModel中的特定对象工作?使用ViewModel强制键入的视图不会自动生成字段

谢谢。

+1

你这是什么意思是当你用多个对象创建一个ViewModel时?我没有意识到有任何机制可以通过ASP.NET MVC在Visual Studio 2008或2010中从视图或模型自动创建ViewModels。请详细说明 – mare 2010-07-25 20:38:03

+0

不,它实际上是从ViewModel创建视图。例如,如果我的模型是具有属性Name和Age的Person,则将使用两个文本框生成视图。但是,如果我有一个封装了Person对象和其他对象的ViewModel,View创建机制不会为Name和Age创建文本框,因为Person在该ViewModel中。如何表示我希望视图为我的ViewModel包装器中的Person创建文本框? – 2010-07-25 21:45:46

+0

您是否期待Visual Studio向导在您的位置编写代码?他们在一定程度上做,但你必须在某个时刻获得主动权。 – 2010-07-25 21:58:54

感谢评论者剔除答案的细节。

MVC的默认EditorFor“主”模板Object.ascx有一个if语句来防止这种情况发生。

要更改此行为,您需要用您自己的模板替换基本/EditorTemplates/Object.ascx模板。这是烤成MVC模板的一个很好的副本:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<% 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> 
<% } %> 

这条线:

<% } else if (ViewData.TemplateInfo.TemplateDepth > 1) { %> 

告诉模板只能往下走你的对象图的一个级别。只需将1替换为2或将其完全移除即可更改MVC向下钻取的距离。

有关模板的更多细节可以在这里找到: http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

(男人,我应该创建一个宏来链接到Brad Wilson的东西,我做这一切的时候);)