2012-03-07 21 views
7

Sto usando ASP.NET MVC rasoio e dati di annotazione validatori Il mio modello:Asp.net MVC 3 Validazione esclude qualche convalida campo in TryUpdateModel

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

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

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

nome e cognome sono Requerd. Voglio modificare FirstName. Il mio metodo è:

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

Ma TryUpdateModel restituisce sempre false. perché LastName non è valido.

Come è possibile impedire la verifica della convalida di Cognome in TryUpdateModel?

Nota:

  • Il codice è semplificato. il mio codice vero e proprio è molto complesso
  • devo usare requierd per due proprietà
  • non voglio utilizzare diversi Classe Modello

risposta

17

Ho trovato la soluzione giusta. Devo rimuovere Field non utilizzato da ModelState. quindi ModelState.IsValid restituisce true. prima ho bisogno Crea nuova classe Attribute:

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(); 
    } 
} 

poi aggiungo attributo sul mio Methode:

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

Guardate questa: http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/

4

Risposta breve: Non è possibile, non usare i dati annotazioni di default.

Risposta più lunga: sono disponibili diverse opzioni.

  1. È possibile creare le proprie annotazioni di convalida.
  2. È possibile ereditare la classe del modello da IValidatableObject e quindi implementare il metodo Validate. (questo non fa la validazione lato client, comunque).
  3. È possibile utilizzare una libreria di convalida di terze parti come FluentValidation.
  4. È possibile creare un modello diverso per questo scenario.
  5. È possibile rimuovere la convalida e aggiungere semplicemente il codice al metodo di azione che controlla se i campi sono corretti. (questo non è raccomandato, poiché aumenta la complessità dell'azione del controller e devi duplicare questa funzionalità ovunque tu stia utilizzando questo modello).
+0

stai Assicurarsi FluentValidation risolvere il problema? Posso usare FluentValidation con EF? – Morteza

+0

@MortezaTavakoli - Non capisco cosa intendi. La tua domanda riguardava MVC non EF. Il tuo modello EF dovrebbe essere diverso dal tuo modello di vista. –

+0

EF non ha niente a che fare con questo.Non importa se si tratta di un modello EF o di un altro modello. – RickAndMSFT

7

una soluzione molto semplice che ho capito.

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

È possibile rimuovere le proprietà Non è necessaria prima di verificare se il modello è valido

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