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属性导致的错误消息相同的方式打印出错误消息。
答案 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)