gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:00:51 25 4
gpt4 key购买 nike

我希望在 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 - Create an adapter for a validator rule that is "on" or "off". The rule requires no additional parameters

所以在 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)我希望它可以在各种自定义验证属性中重复使用。我怎样才能使这个通用?

抱歉,如果我把鼹鼠山变成了一座山。感谢您的宝贵时间:)

拉斯

最佳答案

MVC 附带了 RemoteAttribute,它在内部对 Controller 方法进行 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");
}
}

并用

装饰您的属性(property)
[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详细示例

关于jquery - MVC4 & IClientValidatable - 自动 AJAX 调用服务器端验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27022380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com