使用数据注释时如何使用自定义编辑器模板?

时间:2017-01-04 14:48:17

标签: c# asp.net-mvc

我有一个简单的模型:

public class MyViewModel {
    public MyCustomType EmailAddress {get; set; }
}

在某个视图中,我需要提供一个输入框以允许编辑此属性。理想情况下,我希望继续使用标准@Html.EditorFor语法,因此我创建了一个/Views/Shared/EditorTemplates/MyCustomType.cshtml模板:

@model MyNamespace.MyCustomType
@Html.TextBoxFor(m => m.SomeStringProperty, new { @class = "form-control" })

我还有一个自定义IModelBinder,可以在提交时将此输入读回MyCustomType,这一切都正常。

但是,正如您可以从属性名称中看到的,此属性包含电子邮件地址。我想使用标准数据注释属性来标记它,然后更新MyCustomType.cshtml以便在必要时使用它来呈现<input type="email">输入框 - 而不是{{1}的所有用法是电子邮件地址,因此想要使用标准属性来标记它。当我这样做时:

MyCustomType

我的自定义模板已不再使用 - 而是恢复使用标准public class MyViewModel { [EmailAddress] public MyCustomType EmailAddress {get; set; } } 代码,并且基本上只在EditorFor内显示.ToString() MyCustomType版本的<input>而不是我的自定义编辑器模板,它可以提取特定属性。

有没有办法让它使用我的自定义编辑器模板功能,同时仍然只需要模型添加标准数据注释属性?

1 个答案:

答案 0 :(得分:1)

当涉及到编辑器模板时,数据注释总是优先于类型。您有几个选择:

  1. 创建自定义“EmailAddress”属性。从技术上讲,我认为你几乎可以只是继承EmailAddressAttribute而不实际添加额外的东西。但是,您的自定义属性的名称将允许您使用不同的编辑器模板。

  2. 继续使用EmailAddress.cshtml编辑器模板,但在内部分支。假设MyCustomType继承自String

    @model String
    @if (Model is MyCustomType)
    {
        ...
    }
    else
    {
        ...
    }
    
  3. 可能最简单的方法是简单地指定模板。它不是那么自动,但它不需要任何额外的工作:

     @Html.EditorFor(m => m.EmailAddress, "MyCustomType")
    

    然后加载MyCustomType.cshtml而不是默认EmailAddress.cshtml

相关问题