[asp.net-mvc]最佳实践在视图中使用接口类型作为模型和使用实数类型属性和验证

发布时间: 2017/3/25 13:12:58
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有这种接口︰

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; }
}

我不想创建一个新的视图为每个 Foo1Foo2

所以,已经创建了一个视图具有 IFoo 型模型。

@model IFoo

<div>
    @Html.LabelFor(x => x.Amount)

    @Html.TextBoxFor(x => x.Amount)

    @Html.ValidationMessageFor(x => x.Amount)
</div>

但是,它不会创建客户端不显眼属性喜欢 Range 中客户端的属性。

如果为每个此类型创建新视图,然后一切都会没事。

更新︰我有试着改变接口,抽象类,所提供的答案,但它并没有帮助也。

解决方法 1:

不幸的是你不能这样使用的接口。当您使用 html 帮助器生成 html 时,它首先会生成 ModelMetadata 的属性 (如强类型的 html 佣工,通过调用

ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

这将生成基于属性考虑到其属性的元数据。情况下 TextBoxFor()GetUnobtrusiveValidationAttributes() 的方法 HtmlHelper 然后调用生成 data-val-* 属性。

这里的关键是它是元数据,以及属性,该属性及其获取的元数据不具有任何验证属性。及至"@Model.GetType() 是 Foo1 或 Foo2"你的意见,它并不试图获取具体类型的一个实例并产生它的元数据。

除非你是要创建您自己的 ModelMetadataProvider 和重写 CreateMetadata() 方法,您需要创建单独的视图,每个具体类。

赞助商