我有一个EF Code First模型,我正在通过MVC页面进行编辑,其中一个特定字段始终使用[Required]数据注释返回false。如果我在验证之前硬设置了一个值,它仍然会失败。
这是一个User对象,如果我使用用户名或电子邮件地址作为'username'属性,我可以配置它。
模特:
public class User {
[DisplayName("User Id")]
public int Id { get; set; }
[Required(ErrorMessage="Username is required")]
public string Username { get; set; }
[UIHint("EmailAddress")]
[Required(ErrorMessage = "Email is required")]
[EmailAddress]
public string Email { get; set; }
}
在我看来,如果需要,我只会绘制Username
编辑器:
@if (@ViewBag.LoginMethod == "username") {
@Html.LabelFor(m => m.Username)
@Html.TextBoxFor(m => m.Username, new { autocomplete = "off" })
@Html.ValidationMessageFor(m => m.Username)
}
@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email, new { autocomplete = "off" })
@Html.ValidationMessageFor(m => m.Email)
我的控制器:
[HttpPost]
public ActionResult Create(UserModel viewModel) {
ViewBag.LoginMethod = this.loginMethod.ToString();
var user = new User();
if (this.loginMethod == LoginMethods.Username)
user.Username = viewModel.User.Username;
else
user.Username = viewModel.User.Email;
user.Email = viewModel.User.Email;
user.FirstName = viewModel.User.FirstName;
user.LastName = viewModel.User.LastName;
user.Username = "TEST";
if (TryValidateModel(user) == false) {
this.FlashError("Validation Errors!");
return View(viewModel);
}
throw new Exception("here");
}
如您所见,我正在根据登录方法设置User.Username属性。为了测试,我在验证之前将其设置为“TEST”。 Username Required验证返回false,我最终返回到我的视图中。我从来没有例外。
通过在页面上呈现Username编辑器,无论如何,我已设法使其正常工作。由于我启用了客户端验证,因此我无法在不输入值的情况下提交表单,并且它可以正常工作 - 即使用户名值在验证后仍然是“TEST”。
我开始认为TryValidateModel
不是正确的功能。使用ModelState.IsValid
会产生相同的结果 - 不正确的必需失败。
答案 0 :(得分:0)
首先,我认为您现在可以使用EditFor,以避免每次都创建三个控件(标签,文本框,验证器)。
令我觉得奇怪的另一件事是你的模型似乎是User(m.Email)类型,但你的动作需要一个UserModel(包含一个User)。我不确定为什么你的代码仍然有效。通常,您可以直接将用户作为参数(因此您不必手动复制值)。
如果ModelState.IsValid不起作用,这是正常的。如果您的模型是User类型,它将尝试验证所有POSTED属性,无论它们是否在视图上。另一方面,TryValidateModel应该在您的场景中起作用。似乎有一个额外的安全功能,它考虑清空没有Edit控件的属性。 解决方法是自己为User对象创建自定义模型绑定器(不是那么难,你继承IModelBinder,重写BindModel并调用基本方法。之后,如果UserName为空,则添加“TEST”或者正确的价值。当然,你不能把它留空)。在Asp.net MVC中搜索自定义模型绑定器。
我希望有所帮助!