Validation ASP.Net MVC中模型属性子集的ModelState

Validation ASP.Net MVC中模型属性子集的ModelState,validation,asp.net-mvc-4,modelstate,Validation,Asp.net Mvc 4,Modelstate,我有一个ASP.NETMVC4中的web应用程序 我有一个名为User的模型,它有许多属性,如姓名、电子邮件、密码、生日、性别等 public class UserModel { public string UsrId { get; set; } [Required(ErrorMessage = "Please enter the user's name.")] public string UsrName { get; set; } [Required(Err

我有一个ASP.NETMVC4中的web应用程序

我有一个名为User的模型,它有许多属性,如姓名、电子邮件、密码、生日、性别等

public class UserModel
{
    public string UsrId { get; set; }

    [Required(ErrorMessage = "Please enter the user's name.")]
    public string UsrName { get; set; }

    [Required(ErrorMessage = "Please enter the email.")]
    public string UsrEmail { get; set; }

    [Required(ErrorMessage = "Please enter the password.")]
    public string UsrPwd { get; set; }

    [Required(ErrorMessage = "Please select the gender")]
    public ParamData Gender { get; set; }

    [Required(ErrorMessage = "Please select birthdate")]
    public string UsrBirthDate { get; set; }

//.... other properties
}
我在登录验证中使用了ModelState验证。对于登录,我使用属性电子邮件和密码。这两个属性都有类型为“Required”的注释,以验证不输入空字符串。我使用了一个ViewModel“LoginViewModel”ViewModel,它的属性之一是“User”类型。我调用了ModelState.IsValid,它工作正常

public class LoginViewModel
{
    public UserModel LoginDat { get; set; }
    // other props of ViewModel  ...
}
现在我正在进行注册(注册的第一步)验证。为此,我有一个“Register1ViewModel”viewmodel,同样,它的一个属性是User model类型。但是对于注册(第一步),我只需要以下3个用户属性:姓名、性别、出生日期。这些属性在用户模型中太多。我为这3个属性编写了必需的注释

public class RegiViewModel
{
    public UserModel RegiDat { get; set; }
    // other props of ViewModel  ...
}
[HttPost]
public ActionResult RegisterStep1Post(RegiViewModel VM, string Answer)
{   
    if (ModelState.IsValid)
    {
        RegiViewModel VM2 = GetSomeStuff(VM); 
        return View("Step2Validation", VM2);  // Ok go next step

    }
    else
    {
        return View("RegiStep1ViewPost", VM); // return to form
    }        
}
但当我调用ModelState.IsValid时,结果为false,因为它要求提供电子邮件和密码属性

public class RegiViewModel
{
    public UserModel RegiDat { get; set; }
    // other props of ViewModel  ...
}
[HttPost]
public ActionResult RegisterStep1Post(RegiViewModel VM, string Answer)
{   
    if (ModelState.IsValid)
    {
        RegiViewModel VM2 = GetSomeStuff(VM); 
        return View("Step2Validation", VM2);  // Ok go next step

    }
    else
    {
        return View("RegiStep1ViewPost", VM); // return to form
    }        
}
在使用ModelState.IsValid时,是否有任何方法仅使用模型属性的定义子集?
我不想复制我的用户模型

难道你不能用登录中需要的3个属性创建一个基类吗? 然后从这个派生出你的UserModel类

另一种方法是创建自己的“RequiredAttribute”,但并不推荐:

    public class SpecialRequired : RequiredAttribute
{    
    string _context = "";
    public string Context
    {
        get
        {
            return _context;
        }
        set
        {
            _context = value;
        }
    }

    public override bool IsValid(object value)
    {
        if (_context == "Register")
        {
            return true;
        }
        return false; // With some more own logic
    }
}
您可以这样使用它:
[SpecialRequired(Context=“Register”)]

您需要分解模型

出于登录目的,我假设您只需要电子邮件和密码,因此您的模型应该如下所示:

public class LoginViewModel
{
    [Required(ErrorMessage = "Please enter the email.")]
    public string UsrEmail { get; set; }

    [Required(ErrorMessage = "Please enter the password.")]
    public string UsrPwd { get; set; }
}
您的注册模型应仅包含其关心的信息:

public class RegiViewModel
{
    [Required(ErrorMessage = "Please enter the user's name.")]
    public string UsrName { get; set; }

    [Required(ErrorMessage = "Please select the gender")]
    public ParamData Gender { get; set; }

    [Required(ErrorMessage = "Please select birthdate")]
    public string UsrBirthDate { get; set; }
}

在注册过程中的某个时刻,您将要求用户输入电子邮件和密码。此时,您再次使用
LoginViewModel
类。

请发布模型的代码。我认为您的注册模型会失败,因为存在性别参数数据。在控制器中验证模型时,是否检查了调试中出现错误的确切字段?否,ParamData只是一个类。甚至我也评论说,ModelState给出了false。在调试中,我看到它要求电子邮件和密码。视图模型不应该包含数据模型的属性。整个视图模型是创建一个只包含视图中所需属性的类-我尝试使用继承,但ModelState通过继承并请求基类中的属性。好的,您不仅要添加属性,还需要根据上下文删除“必需”约束。。。。在这种情况下,建议按视图分解模型,如下面Juan所述。最后,它们是“视图模型”。另一种可能是使您自己的“上下文”成为必需的属性。我会在我的回答中添加一个例子,我不认为特殊属性是一个好主意。这感觉就像是由于模型的误用,我们在贴补丁;我也会在不同的onesOk中分解你的模型,所以我会分解它。但是说到电子邮件和密码。这两个属性对于登录和注册是通用的。请编写有关这些属性的登录和注册viewmodels。请问这两门课我该怎么写