Follow the steps and validation of property will be fired as per its value.
Step 1: Create class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
public class RequiredIfAttribute : ValidationAttribute
{ // Note: we don't inherit from RequiredAttribute as some elements of the MVC
// framework specifically look for it and choose not to add a RequiredValidator
// for non-nullable fields if one is found. This would be invalid if we inherited
// from it as obviously our RequiredIf only applies if a condition is satisfied.
// Therefore we're using a private instance of one just so we can reuse the IsValid
// logic, and don't need to rewrite it.
private RequiredAttribute innerAttribute = new RequiredAttribute();
public string DependentProperty { get; set; }
public object TargetValue { get; set; }
public RequiredIfAttribute(string dependentProperty, object targetValue)
{
this.DependentProperty = dependentProperty;
this.TargetValue = targetValue;
}
public override bool IsValid(object value)
{
return innerAttribute.IsValid(value);
}
}
Step 2: Create class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
public class RequiredIfValidator : DataAnnotationsModelValidator<RequiredIfAttribute>
{
public RequiredIfValidator(ModelMetadata metadata, ControllerContext context, RequiredIfAttribute attribute)
: base(metadata, context, attribute)
{
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
// no client validation - I might well blog about this soon!
return base.GetClientValidationRules();
}
public override IEnumerable<ModelValidationResult> Validate(object container)
{
// get a reference to the property this validation depends upon
var field = Metadata.ContainerType.GetProperty(Attribute.DependentProperty);
if (field != null)
{
// get the value of the dependent property
var value = field.GetValue(container, null);
// compare the value against the target value
if ((value == null && Attribute.TargetValue == null) ||
(value.Equals(Attribute.TargetValue)))
{
// match => means we should try validating this field
if (!Attribute.IsValid(Metadata.Model))
// validation failed - return an error
yield return new ModelValidationResult { Message = ErrorMessage };
}
}
}
}
Step 3:
Give reference for these classes in model.
Step 4:
Create property.If this property is true then validation will be fired otherwise not.
public bool AddressIsRequired { get; set; }
Step 5:
Put the validation for property for which you want validation to fire on condition.
[RequiredIf("AddressIsRequired", true, ErrorMessageResourceName = "RequiredFieldMessage", ErrorMessageResourceType = typeof(Resources.Global))]
[StringLength(50, ErrorMessageResourceName = "InvalidStringLength", ErrorMessageResourceType = typeof(Resources.Global))]
public string AddressLine1 { get; set; }
Step 6:
Call from controller.
return View(new AddressModel() { AddressIsRequired = true });
Step 1: Create class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
public class RequiredIfAttribute : ValidationAttribute
{ // Note: we don't inherit from RequiredAttribute as some elements of the MVC
// framework specifically look for it and choose not to add a RequiredValidator
// for non-nullable fields if one is found. This would be invalid if we inherited
// from it as obviously our RequiredIf only applies if a condition is satisfied.
// Therefore we're using a private instance of one just so we can reuse the IsValid
// logic, and don't need to rewrite it.
private RequiredAttribute innerAttribute = new RequiredAttribute();
public string DependentProperty { get; set; }
public object TargetValue { get; set; }
public RequiredIfAttribute(string dependentProperty, object targetValue)
{
this.DependentProperty = dependentProperty;
this.TargetValue = targetValue;
}
public override bool IsValid(object value)
{
return innerAttribute.IsValid(value);
}
}
Step 2: Create class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
public class RequiredIfValidator : DataAnnotationsModelValidator<RequiredIfAttribute>
{
public RequiredIfValidator(ModelMetadata metadata, ControllerContext context, RequiredIfAttribute attribute)
: base(metadata, context, attribute)
{
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
// no client validation - I might well blog about this soon!
return base.GetClientValidationRules();
}
public override IEnumerable<ModelValidationResult> Validate(object container)
{
// get a reference to the property this validation depends upon
var field = Metadata.ContainerType.GetProperty(Attribute.DependentProperty);
if (field != null)
{
// get the value of the dependent property
var value = field.GetValue(container, null);
// compare the value against the target value
if ((value == null && Attribute.TargetValue == null) ||
(value.Equals(Attribute.TargetValue)))
{
// match => means we should try validating this field
if (!Attribute.IsValid(Metadata.Model))
// validation failed - return an error
yield return new ModelValidationResult { Message = ErrorMessage };
}
}
}
}
Step 3:
Give reference for these classes in model.
Step 4:
Create property.If this property is true then validation will be fired otherwise not.
public bool AddressIsRequired { get; set; }
Step 5:
Put the validation for property for which you want validation to fire on condition.
[RequiredIf("AddressIsRequired", true, ErrorMessageResourceName = "RequiredFieldMessage", ErrorMessageResourceType = typeof(Resources.Global))]
[StringLength(50, ErrorMessageResourceName = "InvalidStringLength", ErrorMessageResourceType = typeof(Resources.Global))]
public string AddressLine1 { get; set; }
Step 6:
Call from controller.
return View(new AddressModel() { AddressIsRequired = true });
No comments:
Post a Comment