我正在阅读教程并尝试习惯使用ViewModels和Validation。我不确定验证是在主模型还是视图模型上进行,我认为它是在ViewModel上。但是,如果我试图继承一个类属性,那么在ViewModel上添加验证似乎没有意义,所以我把它留在了模型本身,但错误没有显示出来。也许模型效率低下,需要重新安排一下?
NameModel
public class name {
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
public string first { get; set; }
public string middle { get; set; }
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
public string last { get; set; }
public string otherstuffnotneededontheview { get; set; }
}
RegisterViewModel
public class RegisterViewModel {
public name fname { get; set; }
public name lname { get; set; }
}
查看
@model Project.ViewModels.RegisterViewModel
@using (Html.BeginForm())
{
<label>
@Html.TextBoxFor(model => model.fname.first)
@Html.ValidationMessageFor(model => model.fname.first)
</label>
<label>
@Html.TextBoxFor(model => model.lname.last)
@Html.ValidationMessageFor(model => model.lname.last)
</label>
<input type="submit" />
}
控制器
public ActionResult Register()
{
RegisterViewModel model = new RegisterViewModel();
return View(model);
}
[HttpPost]
public ActionResult Register(RegisterViewModel model)
{
return View(model);
}
答案 0 :(得分:6)
所有验证都需要在ViewModel上完成。
在您的情况下,RegisterViewModel是视图关联public ActionResult Register()
的数据表示,这意味着视图返回RegisterViewModel
对象而不是name
对象。
ModelState.IsValid
检查验证视图的输入[Register.cshtml]与[RegisterViewModel
而不是name
]
因此,只有应用于RegisterViewModel
的属性才会被验证。
因此您需要在ViewModel中执行验证。
这反过来为您提供了额外的灵活性,可以为不同的ViewModel使用不同的验证规则(尽管ViewModel绑定到相同的底层模型)
编辑:(有代码建议)
没有验证规则应用于模型属性
public class name {
public string first { get; set; }
public string middle { get; set; }
public string last { get; set; }
public string otherstuffnotneededontheview { get; set; }
}
它们在ViewModel中应用
public class RegisterViewModel {
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
public string fname { get; set; }
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
public string lname { get; set; }
}
此更改应该足够了(猜测您正确绑定RegisterViewModel
到name
)