ModelState用于ASP.Net MVC中模型的属性子集
我在ASP.Net MVC 4中有一个Web应用程序。
我有一个叫做User的模型,有很多属性,比如Name,Email,Password,BirthDate,Gender等。
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
}
我在Login Validation中使用了ModelState验证。 对于登录,我使用了电子邮件和密码。 两个属性都具有“必需”类型的注释,以验证不输入空字符串。 我使用了ViewModel“LoginViewModel”视图模型,其属性是“用户”类型。 我打电话给ModelState.IsValid ,它工作正常。
public class LoginViewModel
{
public UserModel LoginDat { get; set; }
// other props of ViewModel ...
}
现在我正在进行注册(第一步注册)验证。 为此,我有一个“Register1ViewModel”视图模型,并且它的一个属性的类型是用户模型。 但是对于注册(第一步),我只需要以下3个用户的属性:姓名,性别,出生日期。 这些属性在用户模型中也是如此。 我为这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时,是否有任何方式只使用模型属性的定义子集? 我不想复制我的用户模型。
你需要分解你的模型。
为了登录目的,我假设你只需要一个电子邮件和密码,所以你的模型应该是这样的:
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
类。
难道你不能只用你登录中需要的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”)]
链接地址: http://www.djcxy.com/p/56595.html上一篇: ModelState for a subset of properties of model in ASP.Net MVC