我有这样的界面:
public interface IFoo
{
decimal Amount { get; set; }
}
我有一些视图模型实现它:
public class Foo1 : IFoo
{
[Display(Name = "Foo1 Amount")]
[Range(6, 11)]
public decimal Amount { get; set; }
}
public class Foo2 : IFoo
{
[Display(Name = "Foo2 Amount")]
[Range(1, 5)]
public decimal Amount { get; set; }
}
我不想为Foo1和Foo2中的每一个创建新视图.
所以,我创建了一个具有IFoo类型模型的视图.
@model IFoo
<div>
@Html.LabelFor(x => x.Amount)
@Html.TextBoxFor(x => x.Amount)
@Html.ValidationMessageFor(x => x.Amount)
</div>
但是,它不会在客户端创建客户端不显眼的属性,如Range属性.
如果我为每种类型创建一个新视图,那么每一个都可以.
更新:我已经尝试将界面更改为答案中提供的抽象类,但它也没有帮助.
解决方法:
不幸的是,您无法使用界面执行此操作.当您使用html帮助程序生成html时,它首先为属性生成ModelMetadata(在强类型html帮助程序的情况下,通过调用
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
这会根据属性生成元数据,并考虑其属性.在TextBoxFor()的情况下,然后调用HtmlHelper的GetUnobtrusiveValidationAttributes()方法来生成data-val- *属性.
这里的关键是它的属性元数据,以及获取元数据的属性没有任何验证属性.您的注释“@ Model.GetType()是Foo1或Foo2”,它不会尝试获取具体类型的实例并生成其元数据.
除非您要创建自己的ModelMetadataProvider并覆盖CreateMetadata()方法,否则您需要为每个具体类创建单独的视图.