我正在使用通用Razor视图来允许编辑任何实体框架对象。这是它的简化版本:
@model Object
@using (Html.BeginForm())
{
@foreach (var property in Model.VisibleProperties())
{
@Html.Label(property.Name.ToSeparatedWords())
@Html.Editor(property.Name, new { @class = "input-xlarge" })
}
}
VisibleProperties()函数如下所示:
public static PropertyInfo[] VisibleProperties(this Object model)
{
return model.GetType().GetProperties().Where(info =>
(info.PropertyType.IsPrimitive || info.PropertyType.Name == "String") &&
info.Name != model.IdentifierPropertyName()).OrderedByDisplayAttr().ToArray();
}
(我正在重用https://github.com/erichexter/twitter.bootstrap.mvc/中的代码)
我的一个样本控制器如下:
public ActionResult Edit(int id = 0)
{
TaskTemplate tasktemplate = db.TaskTemplates.Single(t => t.TaskTemplateID == id);
return View(tasktemplate);
}
现在问题: 一切正常,除了有一个与'父'表相关的ID属性,比如UserID。对于这些字段,@ Html.Editor的输出只是: FalseFalseFalseTrueFalse。
True似乎对应于相关用户 - 在本例中是数据库中的第4个用户。
为什么它没有输出一个带有数字4(或用户ID)的好文本框?
我希望我已经清楚地解释了这一点。
答案 0 :(得分:1)
原因是编辑器/显示模板没有递归到复杂的子对象中。如果您希望这样做,您可以为对象类型(~/Views/Shared/Object.cshtml
)编写自定义编辑器模板,如Brad this blog post
中所示(更具体地说是Shallow Dive vs. Deep Dive
部分的结尾)。
所以:
<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>