我有一个简单的模型:
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>
而不是我的自定义编辑器模板,它可以提取特定属性。
有没有办法让它使用我的自定义编辑器模板功能,同时仍然只需要模型添加标准数据注释属性?
答案 0 :(得分:1)
当涉及到编辑器模板时,数据注释总是优先于类型。您有几个选择:
创建自定义“EmailAddress”属性。从技术上讲,我认为你几乎可以只是继承EmailAddressAttribute
而不实际添加额外的东西。但是,您的自定义属性的名称将允许您使用不同的编辑器模板。
继续使用EmailAddress.cshtml
编辑器模板,但在内部分支。假设MyCustomType
继承自String
:
@model String
@if (Model is MyCustomType)
{
...
}
else
{
...
}
可能最简单的方法是简单地指定模板。它不是那么自动,但它不需要任何额外的工作:
@Html.EditorFor(m => m.EmailAddress, "MyCustomType")
然后加载MyCustomType.cshtml
而不是默认EmailAddress.cshtml
。