Asp.net mvc 如何验证已使用MetadataType展开的实体?

Asp.net mvc 如何验证已使用MetadataType展开的实体?,asp.net-mvc,validation,entity-framework-4,Asp.net Mvc,Validation,Entity Framework 4,我有一个EF实体应答器,由EF从数据库自动生成) 我必须扩展此实体以添加一些验证规则和属性,以便在视图中使用: [MetadataType(typeof(RespondentMetadata))] public partial class Respondent { } public class RespondentMetadata { [Required] [Display(Name = "First Name")] public string FirstName {

我有一个EF实体应答器,由EF从数据库自动生成)

我必须扩展此实体以添加一些验证规则和属性,以便在视图中使用:

[MetadataType(typeof(RespondentMetadata))]
public partial class Respondent { }

public class RespondentMetadata
{
    [Required]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }
}
现在,在我的控制器中,我需要检查这个响应对象在FirstName中是否确实有值(没有显式地检查值,因为我可能有大量这样的属性和各种验证规则)

此检查可以在[HttpPost]操作中不需要的任何地方进行(因此,这里的ModelState.IsValid不适用)

如何在代码中的任何位置验证整个实体


谢谢。

教科书方法是向模型添加验证

然后你可以像这样做一张支票

if (Respondent.IsValid())
{
}

“教科书方法”是将验证添加到模型中

然后你可以像这样做一张支票

if (Respondent.IsValid())
{
}
可以使用该方法在代码中的任何位置执行验证,但为此,需要停止使用
MetadataTypeAttribute
,并使用该方法显式关联元数据类

样本:

var respondent = new Respondent();

var provider = new AssociatedMetadataTypeTypeDescriptionProvider(
    typeof (Respondent), 
    typeof (RespondentMetadata));

TypeDescriptor.AddProviderTransparent(provider, typeof (Respondent));

Validator.ValidateObject(
    respondent, 
    new ValidationContext(respondent, null, null));
验证程序
类似乎不支持该属性,因此我知道这是唯一的解决方法。

您可以使用该方法在代码中的任何位置执行验证,但为此,您需要停止使用
MetadataTypeAttribute
并使用该方法显式关联元数据类

样本:

var respondent = new Respondent();

var provider = new AssociatedMetadataTypeTypeDescriptionProvider(
    typeof (Respondent), 
    typeof (RespondentMetadata));

TypeDescriptor.AddProviderTransparent(provider, typeof (Respondent));

Validator.ValidateObject(
    respondent, 
    new ValidationContext(respondent, null, null));

验证程序
类似乎不尊重该属性,因此这是我知道的唯一解决方法。

我可以补充说,您可以通过多种方式实现这一点,例如,为类创建公共接口,如ICanBeValidated,并为此接口编写IsValid扩展方法。有趣。除非你想把它进一步抽象成一个通用的方法,否则有什么好处呢?非常感谢,这似乎是一个可靠的方法。我只是想EF有一些内置的机制,就像前面的答案一样。@DaveA,正如你所说的,唯一的优势是将验证逻辑抽象成一个通用的方法。一种方法比N.更易于维护。。除非N个方法是codegenerated.True。我们可以将此线程旋转到各种各样的地方,但这一点得到了承认。我可以补充说,您可以通过各种方式实现这一点,例如,为您的类创建公共接口,如ICanBeValidated,并为此接口编写IsValid扩展方法。有趣。除非你想把它进一步抽象成一个通用的方法,否则有什么好处呢?非常感谢,这似乎是一个可靠的方法。我只是想EF有一些内置的机制,就像前面的答案一样。@DaveA,正如你所说的,唯一的优势是将验证逻辑抽象成一个通用的方法。一种方法比N.更易于维护。。除非N个方法是codegenerated.True。我们可以将这个线程旋转到各种各样的地方,但这一点得到了承认。我喜欢它的实现。哦,妈妈!:)AssociatedMetadataTypeDescriptionProvider:P这可能是我见过的最长的东西了lol。非常感谢!我会试试看。我喜欢它的实现。哦,妈妈!:)AssociatedMetadataTypeDescriptionProvider:P这可能是我见过的最长的东西了lol。非常感谢!我要试一试。