C# @使用反射属性时显示奇怪结果的Html.Editor

C# @使用反射属性时显示奇怪结果的Html.Editor,c#,asp.net-mvc,reflection,razor,C#,Asp.net Mvc,Reflection,Razor,我使用一个通用的Razor视图来允许编辑任何实体框架对象。以下是它的精简版本: @model Object @using (Html.BeginForm()) { @foreach (var property in Model.VisibleProperties()) { @Html.Label(property.Name.ToSeparatedWords()) @Html.Editor(property.Name,

我使用一个通用的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();
        }
(我正在重用来自的代码)

我的一个示例控制器如下所示:

  public ActionResult Edit(int id = 0)
        {
            TaskTemplate tasktemplate = db.TaskTemplates.Single(t => t.TaskTemplateID == id);
            return View(tasktemplate);
        }
现在的问题是: 除了有一个与“父”表相关的ID属性(如UserID)之外,所有这些都可以正常工作。对于这些字段,@Html.Editor的输出仅为: 假假假

True似乎对应于所讨论的用户—在本例中是数据库中的第四个用户

为什么它不输出一个漂亮的文本框,其中有数字4(或任何用户ID)


我希望我已经解释清楚了。

原因是编辑器/显示模板不会递归到复杂的子对象中。如果您希望这样做,您可以为对象类型(
~/Views/Shared/object.cshtml
)编写一个自定义编辑器模板,如Brad Wilson在中所示(更具体地说是结尾的
浅潜与深潜
部分)

因此:


@foreach(ViewData.ModelMetadata.Properties.Where中的var prop(pm=>pm.ShowForEdit&&!ViewData.TemplateInfo.visted(pm)))
{
if(项目隐藏周围TML)
{
@编辑器(prop.PropertyName)
}
其他的
{
@(项目要求?*:“”)
@Html.Label(prop.PropertyName)
@编辑器(prop.PropertyName)
@Html.ValidationMessage(prop.PropertyName,“*”)
}
}

嗯,我不确定这就是我要找的。我仍然不太明白为什么它不只是将FirmID显示为一个可编辑的整数值?毕竟,这就是财产,不是吗?奇怪的是,我还有一个索引控制器和视图,它使用IEnumerable来显示所有属性。在本例中,它工作正常,并且完美地呈现了整数值。正如我在回答中所解释的,默认情况下,
Html.Editor
helper不会递归到复杂的子属性中。如果你想这样做,你必须为对象类型编写一个自定义编辑器模板。对不起,还是不明白!FirmID只是数据库中的一个
int
。也许问题是:当我只想得到
int
时,如何阻止MVC将其视为一个复杂的值?我可以使用LINQ或dbcontext来阻止这种情况发生吗?我知道这是可能的,因为我的另一个代码使用了对象的
可枚举列表。在这种情况下,正确返回
int
<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>