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

时间:2017-10-04 13:28:49

标签: validation asp.net-mvc-4 modelstate

我在ASP.Net MVC 4中有一个Web应用程序。

我有一个名为用户的模型,其中包含许多属性,如姓名,电子邮件,密码,出生日期,性别等。

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验证。对于登录,我使用了电子邮件和密码属性。这两个属性的注释类型为"必需" ,以验证不输入空字符串。我使用了ViewModel" LoginViewModel" viewmodel其中一个属性是" User"类型。我调用了 ModelState.IsValid ,它运行正常。

public class LoginViewModel
{
    public UserModel LoginDat { get; set; }
    // other props of ViewModel  ...
}

现在我正在进行注册(注册的第一步)验证。为此,我有一个" Register1ViewModel" viewmodel,并且其属性之一是User model类型。但是对于注册(第一步),我只需要以下3个用户的属性:Name,Gender,BirthDate。用户模型中的这些属性也是如此。我为这3个属性编写了必需的注释。

public class RegiViewModel
{
    public UserModel RegiDat { get; set; }
    // other props of ViewModel  ...
}

但是当我调用ModelState.IsValid时,它会导致错误,因为它要求提供电子邮件和密码属性。

[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时,是否有任何方法仅使用模型属性的已定义子集? 我不想复制我的用户模型。

2 个答案:

答案 0 :(得分:2)

你需要打破你的模型。

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

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课程。

答案 1 :(得分:-1)

难道您不能只使用登录中需要的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(上下文= “寄存器”)]