我有一个简单的模型:
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">
输入框-并非所有使用MyCustomType
都是电子邮件地址,因此希望使用标准属性进行标记就这样。当我这样做时:
public class MyViewModel {
[EmailAddress]
public MyCustomType EmailAddress {get; set; }
}
我的自定义模板不再使用-它,而不是恢复到使用标准的EditorFor
代码,本质上只是显示.ToString()
的版本MyCustomType
内的<input>
其中翻出一个特定的属性,而不是我的自定义编辑模板。
有没有办法让它使用我的自定义编辑器模板功能,而仍然只需要模型添加标准数据注释属性?
在涉及编辑器模板时,数据批注始终优先于类型。您有几种选择:
创建一个自定义的“ EmailAddress”属性。从技术上讲,我认为您几乎可以仅继承子类,EmailAddressAttribute
而无需实际添加任何其他内容。不过,自定义属性的名称将允许您为此使用其他编辑器模板。
继续并使用EmailAddress.cshtml
编辑器模板,但在其中分支。假设MyCustomType
继承自String
:
@model String
@if (Model is MyCustomType)
{
...
}
else
{
...
}
不过,最简单的方法可能就是简单地指定模板。它不是完全自动的,但是不需要任何额外的工作:
@Html.EditorFor(m => m.EmailAddress, "MyCustomType")
然后将加载MyCustomType.cshtml
而不是默认值EmailAddress.cshtml
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句