asp.net MVC4中的条件验证

9
我希望能够根据视图所调用的控制器启动一些验证函数...我将在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验证放入我的代码中?

2个回答

11

ASP.NET MVC 3使用jquery unobtrusive validation执行客户端验证。因此,您可以编写一个自定义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 中使用包含它们的对应捆绑包即可。


嘿,Darin。好久没听到你的消息了。但是听起来这似乎是正确的做法。 - SoftwareSavant
我必须在这里补充一点,Foolproof仍然没有Entity Framework支持!如果你想知道为什么在db.SaveChanges()上会出现“未实现异常”,你可能会像我一样需要意识到这还没有编码...参见:http://foolproof.codeplex.com/workitem/18457 - CodingYourLife
1
@Darin Dimitrov 因为没有调用RequiredIfValidator,所以在MVC 4上无法工作。 - CMMaung
是的,就我所尝试的而言, foolproof 在 MVC4 上似乎无法正常工作?有什么想法吗? - Jack

3

另一种解决方案是由Andy West在他的博客上提出的,即在控制器中有条件地从模型状态中删除字段:

当表单被提交时,删除模型状态中的字段,以便它们不被验证:

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

那对我很有用。

1
还不错。虽然晚了几年,但我会接受它。 - SoftwareSavant
1
这些都很好,但Javascript验证仍然会触发,使表单无法提交并且从未到达控制器。在我的情况下,如果注册表单中的国家是“美国”,则将Zip验证为5或5 + 4格式。如果不是美国,则忽略该字段的验证。这似乎是常见功能,但没有找到好的解决方案。除了使用一堆删除或添加回验证数据属性的JavaScript的控制器端验证之外,这是笨拙的。 - stephenbayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接