MVC4& IClientValidatable - 自动AJAX调用服务器端验证

时间:2014-11-19 16:49:47

标签: jquery ajax asp.net-mvc-4 validation

我希望在MVC4中实现自定义客户端验证。我目前使用标准属性,例如我的模型

public class UploadedFiles
{
    [StringLength(255, ErrorMessage = "Path is too long.")]
    [Required(ErrorMessage = "Path cannot be empty.")]
    [ValidPath]
    public string SourceDirectory { get; set; }
}

因此StringLength和Required都会自动转换为一些JQuery客户端验证。目前"有效路径"只适用于服务器端。验证将始终要求服务器端,因为只有服务器可以验证路径是否有效,您无法执行此客户端。

服务器端代码看起来像

public class ValidPathAttribute : ValidationAttribute, IClientValidatable
{
    public string SourceDirectory;

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string path = value.ToString();
        string message = string.Empty;

        var fileSystemSupport = new FileSystemSupport(Settings, new WrappedFileSystem(new FileSystem()));

        if (fileSystemSupport.ValidateNetworkPath(path, out message))
        {
            return ValidationResult.Success;
        }

        return new ValidationResult(message);
    }
} 

这很好用。现在我想通过一个ajax调用来实现这一点,然后进入" IClientValidatable"和" GetClientValidationRules"。在我写完之后我写了

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
        rule.ValidationType = "validpath";
        yield return rule;
    }

我相信我现在必须编写一些自定义验证脚本代码,适配器(用于标识所需的元数据)和验证规则本身(验证器,由rule.ValidationType引用)。

我认为我不需要编写适配器,我可以使用

  

addBool - 为&#34; on&#34;的验证器规则创建适配器。或&#34;关闭&#34;。该规则不需要其他参数

所以在UploadedFiles.js中我现在有了

$.validator.unobtrusive.adapters.addBool("validpath", "required");

在我看来

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/Scripts/UploadedFiles.js")
}

相信这足以挂钩所有内容,但我现在需要编写javascript验证器。它们存在于jQuery.validator对象中,可以使用$ .validator.addMethod添加。

这是我因为以下几个原因而陷入困境的地方:

1)这是关于事情的正确方法,如果我的验证服务于服务器端,那么这是一个ajax调用吗?这将需要同步。

2)是否有一个jQuery元素我应该重用这个?我曾希望,如果我已经完成了工作服务器端,我可以启用一些魔术来连接客户端(很像标准验证)。

3)我希望这可以在各种自定义验证属性中重复使用。我怎样才能使这个通用?

如果我从鼹鼠山上做了一座山,我会道歉。谢谢你的时间:))

拉​​斯

1 个答案:

答案 0 :(得分:4)

MVC附带RemoteAttribute,它在内部对控制器方法进行ajax调用,该方法返回一个Json值,指示验证是成功还是失败

public JsonResult IsValid(string SourceDirectory)
{
  if (someCondition) //test if the value of SourceDirectory is valid
  {
    return Json(true, JsonRequestBehavior.AllowGet); // indicates its valid
  }
  else
  {
    return Json(false, JsonRequestBehavior.AllowGet); // indicates its not valid
    // or return Json("A custom error message that overrides the default message defined in the attribute");
  }
}

并用

装饰你的财产
[Remote("IsValid", "YourController", ErrorMessage = "The path is not valid")]
public string SourceDirectory { get; set; }

注意:RemoteAttribute仅适用于客户端(jquery不显眼的验证),您可能仍需要额外的服务器端验证。

有关详细示例,请参阅How to: Implement Remote Validation in ASP.NET MVC