Esiste un'alternativa per [Bind(Exclude = "Id")]
(Related Question)ASP.NET MVC - alternativa per [Bind (Escludere = "id")]
Potrei scrivere un modello di legante
Esiste un'alternativa per [Bind(Exclude = "Id")]
(Related Question)ASP.NET MVC - alternativa per [Bind (Escludere = "id")]
Potrei scrivere un modello di legante
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.
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;
}
}
}
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");
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)
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). –
Se stai usando ASP.NET core, è possibile decorare la proprietà con un attributo;
[BindNever]
+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
quindi ho bisogno di modelli di vista separati per l'aggiornamento e creare scenari, vero? – Rookian
@Rookian, sì, è una buona pratica avere modelli di visualizzazione separati. –