Model view controller 使用视图模型中对象的属性时,additionalViewData id不会覆盖自动生成id的编辑器

Model view controller 使用视图模型中对象的属性时,additionalViewData id不会覆盖自动生成id的编辑器,model-view-controller,mvvm,asp.net-mvc-4,Model View Controller,Mvvm,Asp.net Mvc 4,我的问题:在我的视图模型中,我创建了一个类InterfaceDisplay,其中包含一些显示属性和其他元数据,用于设置我的界面输入表单 我想知道为什么当我使用additionalViewData对象设置自定义id时,例如@Html.EditorFor(item=>item.Interface.dependentsystem,new{@id=“ls”})我的控件id仍然设置为自动生成的id=“Interface\u dependentsystem”我直接从ViewModel中的属性中覆盖了ID,但

我的问题:在我的视图模型中,我创建了一个类
InterfaceDisplay
,其中包含一些显示属性和其他元数据,用于设置我的界面输入表单

我想知道为什么当我使用additionalViewData对象设置自定义id时,例如
@Html.EditorFor(item=>item.Interface.dependentsystem,new{@id=“ls”})
我的控件id仍然设置为自动生成的
id=“Interface\u dependentsystem”
我直接从ViewModel中的属性中覆盖了ID,但是当它们是对象中的属性时,就没有骰子了

我的视图模型:

public class ApplicationViewModel
{
    //Other Properties

    public class InterfaceDisplay {
        [DisplayName("Linked System")]
        public string DependantSystem { get; set; }

        [DisplayName("Data Flow")]
        public string DataFlow { get; set; }

        [DisplayName("Method")]
        public string Type { get; set; }

        [DisplayName("Name")]
        public string Name { get; set; }

        [DisplayName("Description")]
        [DataType(DataType.MultilineText)]
        public string Description { get; set; }
    }
}
我的看法

@model Namespaces.ApplicationViewModel
<table class="content-table">
        <tr>
            <td style="width: 240px;">
                @Html.Hidden("appid", @Model.Id)

                @Html.LabelFor(item => item.Interface.DependantSystem)
                @Html.EditorFor(item => item.Interface.DependantSystem, new { @id = "ls" })

                @Html.LabelFor(item => item.Interface.DataFlow)
                @Html.EditorFor(item => item.Interface.DataFlow, new { @id = "df" })

                @Html.LabelFor(item => item.Interface.Type)
                @Html.EditorFor(item => item.Interface.Type, new { @id = "mt" })

                @Html.LabelFor(item => item.Interface.Name)
                @Html.EditorFor(item => item.Interface.Name, new { @id = "nm" })

                @Html.LabelFor(item => item.Interface.Description)
                @Html.EditorFor(item => item.Interface.Description, new { @id = "de" })
            </td>
        </tr>
</table>
@model namespace.ApplicationViewModel
@Html.Hidden(“appid”,@Model.Id)
@LabelFor(item=>item.Interface.system)
@EditorFor(item=>item.Interface.dependent系统,新的{@id=“ls”})
@LabelFor(item=>item.Interface.DataFlow)
@EditorFor(item=>item.Interface.DataFlow,新的{@id=“df”})
@LabelFor(item=>item.Interface.Type)
@EditorFor(item=>item.Interface.Type,新的{@id=“mt”})
@LabelFor(item=>item.Interface.Name)
@EditorFor(item=>item.Interface.Name,新的{@id=“nm”})
@LabelFor(item=>item.Interface.Description)
@EditorFor(item=>item.Interface.Description,新的{@id=“de”})

传递给
编辑器for
帮助程序的第二个参数是为相应的编辑器模板定义额外的视图数据。但如果您不编写自定义编辑器模板,则将使用。正如您从我在上一句中链接到的博客文章中所看到的,这个默认模板对您传递给它的附加视图数据属性参数完全不起作用

因此,如果您想让这个参数产生一些效果,您必须编写一个自定义模板——在您的案例中是一个编辑器模板,因为您使用的是EditorFor帮助器。由于将其应用于字符串类型的属性(
Description
),因此可以添加以下自定义编辑器模板
~/Views/Shared/EditorTemplates/string.cshtml
,其中包含以下内容:

@Html.TextBox(
    "", 
    ViewData.TemplateInfo.FormattedModelValue,
    ViewData
)
请注意,我是如何覆盖默认模板的,并将ViewData作为第三个参数传递给TextBox帮助器的,这样,您在视图中创建的匿名对象作为第二个参数传递给EditorFor帮助器,最终成为该模板将生成的相应输入字段的HTML属性

现在,由于无论何时使用
Html.EditorFor(x=>x.SomePropertyOfTypeString,new{@class=“foo”,id=“bar”})
都覆盖了字符串类型的默认编辑器模板,因此将使用此自定义模板而不是默认模板,它将为您生成以下标记:

<input class="foo" id="bar" name="Description" type="text" value="some value" />


那么modelbinding是在控件的Name属性还是控件的id之外发生的呢?我想让我困惑的是,我通过@html.dropdownfor()的附加视图数据提供了@Name=“somename”,然后我的绑定也像我所希望的那样工作,然后当尝试使用ID进行绑定时,它不起作用,我有点让他们困惑。模型绑定发生在Name属性上。但是请注意,HTML帮助程序不允许覆盖name属性。所以写
{name=“foobar”}
是毫无意义的,因为这会被忽略。你应该做的是以一种尊重命名约定的方式来设计视图模型。听起来不错,我被迫以正确的方式来编写视图模型,以使其正常工作。非常感谢你提供的信息,学到了一些东西,非常感谢。