gpt4 book ai didi

asp.net-mvc-3 - 如果填充了另一个字段,则 MVC 3 字段为必填字段

转载 作者:行者123 更新时间:2023-12-02 14:44:17 24 4
gpt4 key购买 nike

我有一个简单的问题。

例如,我在模型 ex 上映射了两个字段:textbox_1 和 textbox_2。

我想问是否存在一种方法(前强制装饰器),仅当我填充textbox_1时才强制执行textbox_2。如果我不填写textbox_1,则文本框2是可选的。

有没有一种优雅的方法来做到这一点?

最佳答案

ASP.NET MVC 中没有为此提供开箱即用的解决方案。这是我为解决该问题而创建的属性。该属性有 3 种可用用法:

  • null 作为 targetValue 传递给构造函数:仅在以下情况下需要依赖字段为空。
  • 将任何值作为 tagetValue 传递:必需仅当依赖字段等于传入任何值时。
  • "*" 传递为tagetValue:仅在填充依赖字段时才需要。

在您的情况下,您需要将 "*" 作为 targetValue 传递给构造函数,这意味着依赖属性可以是任何非空值。

注意:它包含服务器端和客户端(+不引人注目)验证。

服务器端属性类:

public class RequiredIfAttribute : ValidationAttribute, IClientValidatable
{
protected RequiredAttribute _innerAttribute;

public string DependentProperty { get; set; }
public object TargetValue { get; set; }

public bool AllowEmptyStrings
{
get
{
return _innerAttribute.AllowEmptyStrings;
}
set
{
_innerAttribute.AllowEmptyStrings = value;
}
}

public RequiredIfAttribute(string dependentProperty, object targetValue)
{
_innerAttribute = new RequiredAttribute();
DependentProperty = dependentProperty;
TargetValue = targetValue;
}

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// get a reference to the property this validation depends upon
var containerType = validationContext.ObjectInstance.GetType();
var field = containerType.GetProperty(DependentProperty);

if (field != null)
{
// get the value of the dependent property
var dependentValue = field.GetValue(validationContext.ObjectInstance, null);
// trim spaces of dependent value
if (dependentValue != null && dependentValue is string)
{
dependentValue = (dependentValue as string).Trim();

if (!AllowEmptyStrings && (dependentValue as string).Length == 0)
{
dependentValue = null;
}
}

// compare the value against the target value
if ((dependentValue == null && TargetValue == null) ||
(dependentValue != null && (TargetValue == "*" || dependentValue.Equals(TargetValue))))
{
// match => means we should try validating this field
if (!_innerAttribute.IsValid(value))
// validation failed - return an error
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName), new[] { validationContext.MemberName });
}
}

return ValidationResult.Success;
}

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

string depProp = BuildDependentPropertyId(metadata, context as ViewContext);

// find the value on the control we depend on;
// if it's a bool, format it javascript style
// (the default is True or False!)
string targetValue = (TargetValue ?? "").ToString();
if (TargetValue is bool)
targetValue = targetValue.ToLower();

rule.ValidationParameters.Add("dependentproperty", depProp);
rule.ValidationParameters.Add("targetvalue", targetValue);

yield return rule;
}

private string BuildDependentPropertyId(ModelMetadata metadata, ViewContext viewContext)
{
// build the ID of the property
string depProp = viewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(DependentProperty);
// unfortunately this will have the name of the current field appended to the beginning,
// because the TemplateInfo's context has had this fieldname appended to it. Instead, we
// want to get the context as though it was one level higher (i.e. outside the current property,
// which is the containing object, and hence the same level as the dependent property.
var thisField = metadata.PropertyName + "_";
if (depProp.StartsWith(thisField))
// strip it off again
depProp = depProp.Substring(thisField.Length);
return depProp;
}
}

客户端(包括不显眼的验证):

$.validator.addMethod('requiredif',
function (value, element, parameters) {
var id = '#' + parameters['dependentproperty'];

// get the target value (as a string,
// as that's what actual value will be)
var targetvalue = parameters['targetvalue'];
targetvalue = (targetvalue == null ? '' : targetvalue).toString();

// get the actual value of the target control
// note - this probably needs to cater for more
// control types, e.g. radios
var control = $(id);
var controltype = control.attr('type');
var actualvalue =
controltype === 'checkbox' ?
control.attr('checked').toString() :
control.val();

// if the condition is true, reuse the existing
// required field validator functionality
if ($.trim(targetvalue) === $.trim(actualvalue) || ($.trim(targetvalue) === '*' && $.trim(actualvalue) !== ''))
return $.validator.methods.required.call(
this, value, element, parameters);

return true;
});

$.validator.unobtrusive.adapters.add(
'requiredif',
['dependentproperty', 'targetvalue'],
function (options) {
options.rules['requiredif'] = {
dependentproperty: options.params['dependentproperty'],
targetvalue: options.params['targetvalue']
};
options.messages['requiredif'] = options.message;
});

关于asp.net-mvc-3 - 如果填充了另一个字段,则 MVC 3 字段为必填字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10883253/

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