使用ViewModel手动实现一个验证

时间:2014-08-06 23:32:22

标签: c# asp.net-mvc asp.net-mvc-viewmodel

ASP.NET MVC 5问题在这里。我有一个表单的ViewModel,允许某人创建一个由正文,主题和收件人用户名组成的新邮件:

public class CreateMessageViewModel
{
    [Required(ErrorMessage="Subject is required!")]
    public string Subject { get; set; }

    [Required(ErrorMessage="Body is required!")]
    public string Body { get; set; }

    [Display(Name="Recipient Username")]
    [Required(ErrorMessage="Recipient is required!")]
    public string RecipientUsername { get; set; }
}

对于RecipientUsername,我还需要验证指定的用户名是否确实存在,否则拒绝输入并显示消息“Invalid user!”。我不确定将此代码放在何处以实现它。为了澄清,我已经有一个简单的单线函数来检查用户是否存在。我似乎无法弄清楚在哪一线拨打电话。

我确实找到了一种方法来排序,有点处理这个,我猜这是有效的,并且在Controller中,在“if(ModelState.IsValid)”检查之前手动检查用户是否存在。这将防止灾难,因为不会尝试使用无效的用户名保存消息,但它不能以与Required属性导致的错误消息相同的方式打印出错误消息。

2 个答案:

答案 0 :(得分:0)

如果是一次性检查,那么你所做的就是最好的帮助。

但是如果它在您的项目中更常见,并且可以潜在地共享(通过控制器/视图模式方式),那么选项是实现自定义验证属性。

public class UserNameExists : ValidationAttribute
{
 protected override ValidationResult IsValid(object value, ValidationContext validationContext)
 {
  // do your look-up check and return ValidationResult.Success accordingly.
 }
}

现在您可以使用上述属性,就像任何其他内置属性一样,使用友好消息等。

答案 1 :(得分:0)

有两种方法可以解决这个问题。

一种是在物业上使用RemoteAttribute。主要好处是在提交表单之前可以在客户端上进行验证。有关示例,请参阅:

How to: Implement Remote Validation in ASP.NET MVC

另一种是在post方法中添加模型状态错误

public ActionResult Save(CreateMessageViewModel model)
{
  bool exists = // check the existence of RecipientUsername
  if (!exists)
  {
    ModelState.AddModelError("RecipientUsername ", "The user does not exist");
  }
  if (!ModelState.IsValid)
  {
    return View(model);
  }
  // all good
}

这将显示消息"用户不存在" ,无论您在哪里定义@Html.ValidationMessageFor(m => m.RecipientUsername)。或者,第一个参数可以是string.Empty,以便在您定义@Html.ValidationSummary(true)

的位置显示它