gpt4 book ai didi

c# - ASP.Net Core MVC - 自定义属性的客户端验证

转载 作者:IT王子 更新时间:2023-10-29 04:26:45 26 4
gpt4 key购买 nike

在以前版本的 MVC 框架中,自定义验证将通过实现 IClientValidatableGetClientValidationRules 方法来实现。

但是在 ASP.Net Core MVC 中 we do not have this interface ,尽管我们确实有 IClientModelValidator,它定义了一个非常相似的方法。然而,它的实现永远不会被调用。

那么 - 我们如何在 ASP.NET Core MVC 中为自定义属性实现客户端验证?

最佳答案

IClientModelValidator 实际上是正确的接口(interface)。我在下面做了一个人为的示例实现。

注意:有一个 breaking change到 RC1 和 RC2 之间的 IClientModelValidator 接口(interface)。两个选项如下所示 - 其余代码在两个版本之间是相同的。

属性(RC2 及更高版本)

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public sealed class CannotBeRedAttribute : ValidationAttribute, IClientModelValidator
{
public override bool IsValid(object value)
{
var message = value as string;
return message?.ToUpper() == "RED";
}

public void AddValidation(ClientModelValidationContext context)
{
MergeAttribute(context.Attributes, "data-val", "true");
var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
MergeAttribute(context.Attributes, "data-val-cannotbered", errorMessage);
}

private bool MergeAttribute(
IDictionary<string, string> attributes,
string key,
string value)
{
if (attributes.ContainsKey(key))
{
return false;
}
attributes.Add(key, value);
return true;
}
}

属性(RC1)

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public sealed class CannotBeRedAttribute : ValidationAttribute, IClientModelValidator
{
public override bool IsValid(object value)
{
var message = value as string;
return message?.ToUpper() == "RED";
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ClientModelValidationContext context)
{
yield return new ModelClientValidationRule(
"cannotbered",
FormatErrorMessage(ErrorMessage));
}
}

型号

public class ContactModel
{
[CannotBeRed(ErrorMessage = "Red is not allowed!")]
public string Message { get; set; }
}

查看

@model WebApplication22.Models.ContactModel

<form asp-action="Contact" method="post">
<label asp-for="Message"></label>
<input asp-for="Message" />
<span asp-validation-for="Message"></span>
<input type="submit" value="Save" />
</form>

@section scripts {
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
<script>
$.validator.addMethod("cannotbered",
function (value, element, parameters) {
return value.toUpperCase() !== "RED";
});

$.validator.unobtrusive.adapters.add("cannotbered", [], function (options) {
options.rules.cannotbered = {};
options.messages["cannotbered"] = options.message;
});
</script>
}

关于c# - ASP.Net Core MVC - 自定义属性的客户端验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36566836/

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