2011-01-07 13 views

risposta

25

sì, c'è: si chiama? . Visualizza i modelli Visualizza i modelli sono classi che sono specificamente adattati alle esigenze specifiche di una determinata vista

Così, invece di:.

public ActionResult Index([Bind(Exclude = "Id")] SomeDomainModel model) 

uso:

public ActionResult Index(SomeViewModel viewModel) 

dove il modello di vista contiene solo le proprietà che devono essere associate. Quindi è possibile eseguire la mappatura tra il modello di vista e il modello. Questa mappatura potrebbe essere semplificata con AutoMapper.

Come best practice, consiglierei di utilizzare sempre i modelli di visualizzazione da e verso una vista.

+2

+1 Questa è la descrizione migliore che abbia mai visto su ViewModel vs Business model. Non ci ho mai pensato da un punto di vista della sicurezza. Ma è ** il ** motivo per utilizzare un modello di visualizzazione, almeno per http. – jgauffin

+0

quindi ho bisogno di modelli di vista separati per l'aggiornamento e creare scenari, vero? – Rookian

+1

@Rookian, sì, è una buona pratica avere modelli di visualizzazione separati. –

10

Una soluzione molto semplice che ho capito.

public ActionResult Edit(Person person) 
{ 
    ModelState.Remove("Id"); // This will remove the key 

    if (ModelState.IsValid) 
     { 
      //Save Changes; 
     } 
    } 
} 
3

Come detto Desmond, trovo rimuovere molto facile da usare, anche io ho fatto una semplice estensione che può rivelarsi utile per molteplici oggetti di scena per essere ignorato ...

/// <summary> 
    /// Excludes the list of model properties from model validation. 
    /// </summary> 
    /// <param name="ModelState">The model state dictionary which holds the state of model data being interpreted.</param> 
    /// <param name="modelProperties">A string array of delimited string property names of the model to be excluded from the model state validation.</param> 
    public static void Remove(this ModelStateDictionary ModelState, params string[] modelProperties) 
    { 
     foreach (var prop in modelProperties) 
      ModelState.Remove(prop); 
    } 

Puoi utilizzarlo come questo nel vostro metodo di azione:

ModelState.Remove("ID", "Prop2", "Prop3", "Etc"); 
6

in aggiunta alle risposte esistenti, C# 6 permette di escludere la struttura in un modo più sicuro:

public ActionResult Edit(Person person) 
{ 
    ModelState.Remove(nameof(Person.Id)); 

    if (ModelState.IsValid) 
     { 
      //Save Changes; 
     } 
    } 
} 

o

public ActionResult Index([Bind(Exclude = nameof(SomeDomainModel.Id))] SomeDomainModel model) 
+0

Mi piace questa risposta, ma credo ancora che dovresti usare [ViewModels] (http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc) e [POCO's] (http: // stackoverflow. it/questions/250001/poco definizione) per quanto riguarda Design Pattern e [SoC] (http://stackoverflow.com/questions/98734/what-is-separation-of-concerns). –

0

Se stai usando ASP.NET core, è possibile decorare la proprietà con un attributo;

[BindNever] 
Problemi correlati