使用ViewModel强制键入的视图不会自动生成字段
问题描述:
当我创建视图并将其直接绑定到具有要显示在视图上的属性的类时,字段(文本框等)为自动创建。但是,当我创建一个ViewModel封装多个对象与数据,这不会发生。有没有办法让ViewModel中的特定对象工作?使用ViewModel强制键入的视图不会自动生成字段
谢谢。
答
感谢评论者剔除答案的细节。
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的东西,我做这一切的时候);)
你这是什么意思是当你用多个对象创建一个ViewModel时?我没有意识到有任何机制可以通过ASP.NET MVC在Visual Studio 2008或2010中从视图或模型自动创建ViewModels。请详细说明 – mare 2010-07-25 20:38:03
不,它实际上是从ViewModel创建视图。例如,如果我的模型是具有属性Name和Age的Person,则将使用两个文本框生成视图。但是,如果我有一个封装了Person对象和其他对象的ViewModel,View创建机制不会为Name和Age创建文本框,因为Person在该ViewModel中。如何表示我希望视图为我的ViewModel包装器中的Person创建文本框? – 2010-07-25 21:45:46
您是否期待Visual Studio向导在您的位置编写代码?他们在一定程度上做,但你必须在某个时刻获得主动权。 – 2010-07-25 21:58:54