加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在View中使用接口类型作为模型并使用实际类型属性和验证的

发布时间:2020-12-15 22:17:03 所属栏目:百科 来源:网络整理
导读:我有这样的界面: 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(N
我有这样的界面:

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()方法,否则您需要为每个具体类创建单独的视图.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读