【问题标题】:Conditional Validation in asp.net MVC4asp.net MVC4 中的条件验证
【发布时间】:2012-10-11 15:33:23
【问题描述】:

我希望能够根据调用视图的控制器启动一些验证功能...我将在 ViewState 或其他内容中设置一个变量,这将帮助我知道从哪个控制器调用该视图。

换句话说,如果设置了某个变量,我希望验证是必需的...当我将 Jquery 放入我的代码时,这是我在 MVC2 中使用的方法...

HospitalFinNumber: {
                    required: function (element) {
                        debugger;
                        return '@isFlagSet' != 'True'; 
                    },
                    minlength: 6,
                    remote: function () {
                        //debugger;
                        return {
                            url: '@Url.Action("ValidateHosFin", "EditEncounter")',
                            data: { hospitalFin: $('#HospitalFinNumber').val(), encflag: '@encflag' }
                        };
                    }
                }

你看我在那里做什么。仅当设置了某个变量时才需要此验证...在这种情况下,变量 isFlagSet... 然后我将设置 min Length 并调用远程函数以确保该值是唯一的。

我不想在所有情况下都这样做。

从我目前所读的所有内容来看,没有明确的方法可以使用不显眼的 ajax 来实现这一点?我错了,有没有办法可以做到这一点?如果没有,我怎样才能将常规的旧 jquery 验证放入我的代码中?

【问题讨论】:

    标签: jquery-validate asp.net-mvc-4


    【解决方案1】:

    ASP.NET MVC 3 使用 jquery 不显眼的验证来执行客户端验证。因此,您可以编写一个custom RequiredIf 验证属性或使用Mvc Foolproof Validation 中提供的属性,然后:

    public class MyViewModel
    {
        [RequiredIf("IsFlagSet", true)]
        [Remote("ValidateHosFin", "EditEncounter")]
        [MinLength(6)]
        public string HospitalFinNumber { get; set; }
    
        public bool IsFlagSet { get; set; }
    
        public string EncFlag { get; set; }
    }
    

    那么剩下的就是包含jquery.validate.jsjquery.validate.unobtrusive.js 脚​​本,或者在包含它们的ASP.NET MVC 4 中使用相应的包。

    【讨论】:

    • 嘿达林。我已经有一段时间没有收到你的消息了。但这听起来像是要走的路。
    • 我必须在这里补充一下,Foolproof 仍然没有实体框架支持!如果您想知道为什么会在 db.SaveChanges(); 上收到“未实现的异常”;你可能和我一样,需要意识到这还没有编码......另见:foolproof.codeplex.com/workitem/18457
    • @Darin Dimitrov 它在 MVC 4 上不起作用,因为它没有调用RequiredIfValidator
    • 是的,据我尝试万无一失似乎不适用于 MVC4?有什么想法吗?
    【解决方案2】:

    Andy West 在他的blog 上建议的另一个解决方案是有条件地从控制器中的模型状态中删除字段

    发布表单后,从模型状态中删除字段,以免对其进行验证:

    if (Request.IsAuthenticated)
    {
        ModelState.Remove("CommenterName");
        ModelState.Remove("Email");
    }
    

    这对我有用。

    【讨论】:

    • 不错。晚了几年,但我会接受的。
    • 这一切都很好,但是 Javascript 验证仍然会启动,它会阻止表单发布并且永远不会到达控制器。在我的情况下,如果注册表中的国家是“美国”,那么将 Zip 验证为 5 或 5+4 格式。如果不是美国,则忽略该字段的验证。这似乎是常见的功能,找不到好的解决方案。除了使用大量 javascript 来删除或添加验证数据属性的控制器端验证之外,这很笨拙。
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多