必需的验证程序始终返回false

时间:2011-11-24 09:00:26

标签: asp.net-mvc-3 entity-framework-4

我有一个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会产生相同的结果 - 不正确的必需失败。

1 个答案:

答案 0 :(得分:0)

首先,我认为您现在可以使用EditFor,以避免每次都创建三个控件(标签,文本框,验证器)。

令我觉得奇怪的另一件事是你的模型似乎是User(m.Email)类型,但你的动作需要一个UserModel(包含一个User)。我不确定为什么你的代码仍然有效。通常,您可以直接将用户作为参数(因此您不必手动复制值)。

如果ModelState.IsValid不起作用,这是正常的。如果您的模型是User类型,它将尝试验证所有POSTED属性,无论它们是否在视图上。另一方面,TryValidateModel应该在您的场景中起作用。似乎有一个额外的安全功能,它考虑清空没有Edit控件的属性。 解决方法是自己为User对象创建自定义模型绑定器(不是那么难,你继承IModelBinder,重写BindModel并调用基本方法。之后,如果UserName为空,则添加“TEST”或者正确的价值。当然,你不能把它留空)。在Asp.net MVC中搜索自定义模型绑定器。

我希望有所帮助!