我是一名有用的助手,可以为您翻译文本。
这是我的注册控制器:
我有一个MVC Web项目。根据最佳实践,添加验证规则和业务规则的正确位置在哪里?
验证规则将包括必填字段和所需格式。
业务规则将包括“此电子邮件已在数据库中使用”等内容。
以下是我目前在注册模型中的处理方式:
public class RegisterModel : IValidatableObject
{
[Display(Name = "Email address")]
[Required(ErrorMessage = "The email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var retVal = new List<ValidationResult>();
using (var entity = new AcademicUniteDatabaseEntities())
{
if (entity.UserProfiles.Any(x => x.UserName == this.Email))
{
retVal.Add(new ValidationResult("Email already exist", new List<string> { "Email" }));
}
}
return retVal;
}
}
这是我的注册控制器:
public ActionResult Register()
{
var model = new RegisterModel();
return this.View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (!this.ModelState.IsValid)
{
return this.View(model);
}
model.CreateAccount();
return this.View("WaitConfirmEmail");
}
我为什么要这样做
- 当我在控制器中检查ModelState.IsValid时,它将会检查电子邮件的格式以及它是否已存在于数据库中。我不会在我的控制器中调用任何数据库,只在我的模型中调用。(这是最佳实践吗?)
- 它还将"电子邮件已存在"的验证结果绑定到我的电子邮件属性上,以便我可以在视图中显示验证结果。
这是最佳实践吗?
- 这是在MVC中添加业务规则的正确方式吗?
- 为什么或为什么不是?
- 如果这不是最佳实践,您能否提供一个例子,说明如何编写最佳的注册模型以检查业务规则(例如:电子邮件是否已存在)?