gpt4 book ai didi

asp.net-mvc - ASP.NET MVC : Implement client side validation with attribute without IClientValidatable

转载 作者:行者123 更新时间:2023-12-02 07:08:48 24 4
gpt4 key购买 nike

如何在不实现 IClientValidatable 的情况下创建具有客户端验证的自定义验证属性?

System.ComponentModel.DataAnnotations.RequiredAttribute 客户端如何验证?

这样做的原因是因为我使用另一个项目中的类中的对象作为我的 View 中的模型,并且我不想添加对该项目的 System.Web.MVC 引用.

编辑以添加更多信息:

  • 我知道 IClientValidatable 用于向稍后不引人注目的验证将使用的 HTML。

  • 我知道我需要添加 javascript 代码来进行验证客户。

我不知道如何使用自定义验证属性中的信息将必要的属性添加到 HTML 中,以使不显眼的验证发挥作用。

这是我的自定义验证属性:

public class RequiredGuidAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
Guid? guidValue = value as Guid?;

if (guidValue == null)
return false;

return guidValue != Guid.Empty;
}
}

这是我应用了属性的属性:

    [RequiredGuid(ErrorMessageResourceType = typeof(ClientOrderResources), ErrorMessageResourceName = "RequiredShippingMethod")]
public Guid ShippingMethodId
{
get { return GetProperty(ShippingMethodIdProperty); }
set { SetProperty(ShippingMethodIdProperty, value); }
}

最后,我使用 Html.HiddenFor 在 View 中渲染该属性的隐藏输入。

现在,如何从属性中获取错误消息并将其应用到 HTML?我应该使用反射自己做还是有更好的方法?

然后我如何告诉 Html.HiddenFor 使用该信息向 HTML 添加必要的属性?

最佳答案

我们也遇到了类似的问题。我们有一个用于创建帐户的模型,该模型在其自定义属性上使用 IClientValidatable。但是,我们创建了一个位于网站外部的批量帐户创建过程,我们无法在其中引用 System.Web.Mvc。因此,当我们调用 Validator.TryValidateObject 时,从 IClientValidatable 继承的任何自定义验证器都只是简单地跳过了。以下是我们正在处理的问题,但未能在我们的网站之外进行验证:

public class AgeValidatorAttribute : ValidationAttribute, IClientValidatable
{
public int AgeMin { get; set; }
public int AgeMax { get; set; }

public override bool IsValid(object value)
{
//run validation
}
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = ErrorMessageString,
ValidationType = "agevalidator"
};

rule.ValidationParameters["agemin"] = AgeMin;
rule.ValidationParameters["agemax"] = AgeMax;

yield return rule;
}

删除 System.Web.Mvc 还要求我们删除 GetClientValidationRules 和 IClientValidatable 引用。为了做到这一点并仍然进行客户端验证,我们必须创建一个新类:

public class AgeValidatorClientValidator : DataAnnotationsModelValidator<AgeValidatorAttribute>
{
private readonly string _errorMessage;
private readonly string _validationType;

public AgeValidatorClientValidator(ModelMetadata metadata, ControllerContext context, AgeValidatorAttribute attribute)
: base(metadata, context, attribute)
{
this._errorMessage = attribute.FormatErrorMessage(metadata.DisplayName);
this._validationType = "agevalidator";
}

public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var rule = new ModelClientValidationRule
{
ErrorMessage = this._errorMessage,
ValidationType = this._validationType
};

rule.ValidationParameters["agemin"] = base.Attribute.AgeMin;
rule.ValidationParameters["agemax"] = base.Attribute.AgeMax;

yield return rule;
}
}

如您所见,它的功能与以前基本相同,只是使用 DataAnnatotationsModelValidator 而不是 IClientValidatable 来完成。我们还需要执行一步才能将 DataAnnotationsModelValidator 实际附加到属性,这是在 Global.asax.cs Application_Start 方法中完成的

DataAnnotationsModelValidatorProvider.RegisterAdapter(
typeof(AgeValidatorAttribute), typeof(AgeValidatorClientValidator));

现在您可以像使用普通属性一样使用它:

[AgeValidator(AgeMax = 110, AgeMin = 18, ErrorMessage = "The member must be between 18 and 110 years old")]
public string DateOfBirth { get; set; }

我知道这个问题已经有一年了,但我昨天花了一整天和今天的一半时间试图解决这个问题。因此,如果 OP 尚未找到答案,我希望这可以帮助遇到同样问题的人。

请注意,我在本文中没有包含任何 JavaScript,因为它不需要对使用 jQuery.validate 的自定义验证规则的标准实现进行任何更改。

关于asp.net-mvc - ASP.NET MVC : Implement client side validation with attribute without IClientValidatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14283216/

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