【问题标题】:Validation in MVC5 not workingMVC5 中的验证不起作用
【发布时间】:2014-04-02 17:13:43
【问题描述】:

我正在使用 Visual Studio 2012 和 Entity Framework 6。我下载了 MVC5 的更新。我创建了一个模型类CreateUser 如下

   public class CreateNewUser
    {
        [Required]
        [Display(Name = "Name")]
        public String Name{set;get;}
        [Required]
        [Display(Name = "Mobile")]
        [RegularExpression(@"^([0|\+[0-9]{1,5}[\-\s])?([7-9][0-9]{9})$", ErrorMessage = "Entered phone format is not valid.")]
        public String Mobile { get; set; }
        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public String Email { get; set; }
        [Required]
        [Display(Name = "Password")]
        [DataType(DataType.Password)]
        public String Password { get; set; }
    }

并使用这个模型类创建一个视图。当我运行它提交的表单时没有验证。我在服务器上使用了ModelState.IsValid 并跳过它。即使表单有空字段,它也总是显示为真。 客户端和服务器端验证在mvc3mvc4 中工作。但我搬到了mvc5 它不工作。 ClientValidationEnabledUnobtrusiveJavaScriptEnabledwebconfig 中设置为 true。我需要在MVC5 中设置什么来启用验证

【问题讨论】:

    标签: c# validation asp.net-mvc-5


    【解决方案1】:

    拥有强类型 View 提交并触发客户端验证通常是开箱即用的。

    例如,我刚刚在 VS 2013(不是 VS 2012)中创建了一个新项目,并选择了带有 Individual User Accounts 的 MVC 模板(以加载、捆绑所有适当的脚本等)。

    然后,我创建了一个名为 CreateNewUser 的 ViewModel 并复制/粘贴了您的所有属性。

    然后,我在 Controller 中创建了两个 ActionResult。一个加载视图,另一个处理表单的提交。

    public ActionResult CreateUser()
    {
        var model = new CreateNewUser();
        return View(model);
    }
    
    [HttpPost]
    public ActionResult CreateUser(CreateNewUser model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
    
        //Model is valid so continue...
        return null;
    }
    

    然后,我创建了这个 CreateNewUser 类的强类型视图。

    当我点击提交按钮时,表单的客户端验证完美运行!

    也许,您应该创建一个全新的项目,无论是 VS2012 还是 VS2013,并像我一样创建一个简单的示例。从那里开始,让它发挥作用,当它发挥作用时,尝试比较与您当前情况不同的事情。

    这就是我尝试通过比较可行的解决方案与不可行的解决方案来找出问题的解决方案,以找出真正的罪魁祸首。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      如果您通过单元测试评估 IsValid 标志,它似乎始终为真,并且验证属性被完全忽略(但当它通过 IIS Express 执行相同的代码时工作正常)。

      我们找到了解决此问题的方法,即在检查 IsValid 之前调用 controller.TryValidateModel。如果你不想污染你的生产代码,你可以使用单元测试中的反射来做到这一点。

      【讨论】:

        猜你喜欢
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        • 2014-04-17
        • 2018-02-27
        相关资源
        最近更新 更多