2012-03-07 19 views
7

estoy usando ASP.NET MVC afeitar y anotación de datos validadores Mi modelo:Asp.net MVC 3 Validación excluir algunos validación de campo en TryUpdateModel

public class Person 
{ 
    public int id { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 
} 

nombre y apellido son Requerd. Quiero Editar Nombre. Mi Methode es:

public ActionResult Edit([Bind(Include = "FirstName")]Person person) 
{ 
    var p = GetPerson(); 
    if (TryUpdateModel(p)) 
    { 
     //Save Changes; 
    } 
} 

Pero siempre vuelven TryUpdateModel falsa. porque LastName no es válido

¿Cómo puedo evitar la validación de cheques de LastName en TryUpdateModel?

Nota:

  • El código se simplifica. mi código real es muy complejo
  • tengo que usar para dos requierd Propiedad
  • yo no desea utilizar diferentes Clase Modelo

Respuesta

17

Encontré Nice Solution. Debo eliminar el campo no utilizado de ModelState. entonces ModelState.IsValid return true. primero necesito Crear nueva clase Atributo:

public class ValidateOnlyIncomingValuesAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var modelState = filterContext.Controller.ViewData.ModelState; 
     var valueProvider = filterContext.Controller.ValueProvider; 

     var keysWithNoIncomingValue = modelState.Keys.Where(x=>!valueProvider.ContainsPrefix(x)); 
     foreach (var key in keysWithNoIncomingValue) 
      modelState[key].Errors.Clear(); 
    } 
} 

Luego añadir Atributo en mi méthode:

[ValidateOnlyIncomingValuesAttribute] 
public ActionResult Edit([Bind(Include = "FirstName")]Person person) 
{ 
    var p = GetPerson(); 
    if (ModelState.IsValid) 
    { 
     TryUpdateModel(p); 
     //Save Changes; 
    } 
} 

vistazo a esto: http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/

4

respuesta corta: No se puede, no usar las anotaciones de datos por defecto.

Respuesta más larga: Tiene varias opciones.

  1. Puede crear sus propias anotaciones de validación.
  2. Puede hacer que su clase de modelo herede de IValidatableObject y luego implementar el método Validate. (sin embargo, esto no valida al cliente).
  3. Puede usar una biblioteca de validación de terceros como FluentValidation.
  4. Puede crear un modelo diferente para este escenario.
  5. Puede eliminar la validación y solo agregar código a su método de acción que verifica si los campos son correctos. (Esto no se recomienda, ya que esto aumenta la complejidad de la acción de su controlador, y debe duplicar esta funcionalidad en cualquier lugar donde use este modelo).
+0

están FluentValidation se asegura de resolver el problema? ¿Puedo usar FluentValidation con EF? – Morteza

+0

@MortezaTavakoli - No entiendo a qué te refieres. Su pregunta fue sobre MVC no EF. Su modelo EF debe ser diferente de su modelo de vista. –

+0

EF no tiene nada que ver con eso.No importa si es un modelo EF u otro modelo. – RickAndMSFT

7

Una solución muy sencilla que me di cuenta.

public ActionResult Edit(Person person) 
{ 
    ModelState.Remove("FirstName"); // This will remove the key 
    var p = GetPerson(); 
    if (TryUpdateModel(p)) 
     { 
      //Save Changes; 
     } 
    } 
} 
13

Puede eliminar las propiedades que no necesito antes de comprobar si el modelo es válido

ModelState.Remove("Email"); 
if (ModelState.IsValid) 
{ 
    // whatever you want to do 
} 
Cuestiones relacionadas