0

我正在使用通用 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/erihexter/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)?

我希望我已经清楚地解释了这一点。

4

1 回答 1

1

原因是编辑器/显示模板不会递归到复杂的子对象中。如果您希望发生这种情况,您可以为对象~/Views/Shared/Object.cshtml类型this blog postShallow 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>
于 2013-05-16T13:25:08.457 回答