2011-05-26 4 views

Respuesta

6

algo entre las líneas deben ajustarse a la ley:

public class DynamicRegularExpressionAttribute : ValidationAttribute 
{ 
    public string PatternProperty { get; set; } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     PropertyInfo property = validationContext.ObjectType.GetProperty(PatternProperty); 
     if (property == null) 
     { 
      return new ValidationResult(string.Format("{0} is unknown property", PatternProperty)); 
     } 
     var pattern = property.GetValue(validationContext.ObjectInstance, null) as string; 
     if (string.IsNullOrEmpty(pattern)) 
     { 
      return new ValidationResult(string.Format("{0} must be a valid string regex", PatternProperty)); 
     } 

     var str = value as string; 
     if (string.IsNullOrEmpty(str)) 
     { 
      // We consider that an empty string is valid for this property 
      // Decorate with [Required] if this is not the case 
      return null; 
     } 

     var match = Regex.Match(str, pattern); 
     if (!match.Success) 
     { 
      return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); 
     } 

     return null; 
    } 
} 

y luego:

Modelo:

public class City 
{ 
    [DynamicRegularExpression(PatternProperty = "RegEx")] 
    public string Zip { get; set; } 
    public string RegEx { get; set; } 
} 

controlador:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var city = new City 
     { 
      RegEx = "[0-9]{5}" 
     }; 
     return View(city); 
    } 

    [HttpPost] 
    public ActionResult Index(City city) 
    { 
     return View(city); 
    } 
} 

Vista:

@model City 
@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(x => x.RegEx) 

    @Html.LabelFor(x => x.Zip) 
    @Html.EditorFor(x => x.Zip) 
    @Html.ValidationMessageFor(x => x.Zip) 

    <input type="submit" value="OK" /> 
} 
+0

Hola Darin gran solución pero no funcionan en el lado del cliente de validación unobtrustiv Philipp –

+1

@Philipp Troxler, eso es normal. No lo implementé ya que la validación del lado del cliente no era parte de tu pregunta. Para lograr esto, puede hacer que este atributo implemente 'IClientValidatable' y registre un adaptador jQuery personalizado. Aquí hay un ejemplo que puede ponerlo en el camino correcto: http://stackoverflow.com/questions/4784943/asp-net-mvc-3-client-side-validation-with-parameters/4784986#4784986 –

+0

Gracias ... ahora funciona –

0

reemplazar el método Validar que toma la ValidationContext como un parámetro, utilice el ValidationContext para obtener la expresión regular de la propiedad relacionada y aplicar la expresión regular, devolver el valor coincidente.

Cuestiones relacionadas