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

时间:2013-01-11 21:57:28

标签: model-view-controller mvvm asp.net-mvc-4

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

我想知道为什么当我使用additionalViewData对象设置自定义ID时,例如。 @Html.EditorFor(item => item.Interface.DependantSystem, new { @id = "ls" })是我的控件ID仍然设置为自动生成的id="Interface_DependantSystem"我直接从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>

1 个答案:

答案 0 :(得分:2)

要传递给EditorFor帮助器的第二个参数是为相应的编辑器模板定义其他视图数据。但是,如果您不编写自定义编辑器模板,则将使用default template。正如你在我之前的句子中链接到的博客文章中所看到的,这个默认模板对你传递给它的附加视图数据属性参数没有任何作用。

因此,如果您希望此参数具有某些效果,则必须编写自定义模板 - 在您的情况下为编辑器模板,因为您正在使用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" />