Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 如何覆盖数据注释_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 4 如何覆盖数据注释

Asp.net mvc 4 如何覆盖数据注释,asp.net-mvc-4,Asp.net Mvc 4,我有一个person类,就这个问题而言,它是 public class Person { [Required(ErrorMessage = "***")] [Display(Name = "Your full name")] public string Name { get; set; } } 我继承的这是我的抱怨课 public class Complaints : Person { [Required(ErrorMessage = "***")] [

我有一个person类,就这个问题而言,它是

public class Person
{
    [Required(ErrorMessage = "***")]
    [Display(Name = "Your full name")]
    public string Name { get; set; }
}
我继承的这是我的抱怨课

public class Complaints : Person
{
    [Required(ErrorMessage = "***")]
    [Display(Name = "Detail of the issue")]
    public string Detail{ get; set; }
}
一切正常

问题是,我们现在希望用户不需要填写他们的全名,但我已经将其设置为required

因为我的Person类在其他地方使用,所以我不能更改必需的属性


如何覆盖派生类中的
DataAnnotations
?我在猜测(这也解释了我的困惑),因为
DataAnnotation
属于属性,我不能只覆盖
DataAnnotation
,而必须覆盖整个属性?

您可以使用自定义的
DataAnnotationsModelMetadataProvider

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

        // fiddle with metadata here

        return modelMetadata;
    }
}

然而,真正的解决方案是将您的继承分离成一种关系。用“现实世界”的术语来思考问题——比如狗是动物,所以:
dog:animal
狗有主人,所以主人是狗的财产,狗不从主人那里继承。在这种情况下,投诉人应该是财产而不是基本案例,因为投诉人不是个人。

您可以使用自定义的
数据注释ModelMetadataProvider

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

        // fiddle with metadata here

        return modelMetadata;
    }
}

然而,真正的解决方案是将您的继承分离成一种关系。用“现实世界”的术语来思考问题——比如狗是动物,所以:
dog:animal
狗有主人,所以主人是狗的财产,狗不从主人那里继承。在这种情况下,投诉人应该是财产而不是基本案例,因为投诉人不是人。

使用
new
关键字。将属性添加到
投诉
-
公共新字符串名称{get;set;}
(不带属性)或更好,请使用视图模型。谢谢。如何在此实例中使用ViewModel?它与属性为@StephenMuecke的类有何不同?视图模型是特定于视图的类。请参阅使用
new
关键字。将属性添加到
投诉
-
公共新字符串名称{get;set;}
(不带属性)或更好,请使用视图模型。谢谢。如何在此实例中使用ViewModel?它与属性为@StephenMuecke的类有何不同?视图模型是特定于视图的类。参考