ASP.NET-MVC2: Perché TryUpdateModel ignora proprietà dopo il secondo livello della struttura oggetto del modello?
-
26-09-2019 - |
Domanda
Forse mi manca qualcosa qui, ma sembra che nulla nell'albero degli oggetti del modello 3 o più livelli verso il basso, viene ignorato quando si utilizza TryUpdateModel.
Per esempio (semplificato):
public virtual ActionResult SomeAction(int id, FormCollection form)
{
IValueProvider vpFrom = form.ToValueProvider();
/*
At this stage, vpForm contains:
1)PropertyA
2) PropertyB.SubPropertyA
3) PropertyB.SubPropertyB.SubSubPropertyA
*/
TryUpdateModel(someObjectModel, null, null, null, vpFrom);
//The first two properties are applied, number (3) seems to be ignored
mi manca qualcosa qui? Se questo è solo il modo in cui è, qualcuno ha messo a punto una soluzione?
Soluzione
Un progetto semplice realizzato con il seguente modello.
public class TestModel {
public TestModelA A { get; set; }
public string Name { get; set; }
}
public class TestModelA {
public TestModelB B { get; set; }
public string Name { get; set; }
}
public class TestModelB {
public TestModelC C { get; set; }
public string Name { get; set; }
}
public class TestModelC {
public TestModelD D { get; set; }
public string Name { get; set; }
}
public class TestModelD {
public TestModelE E { get; set; }
public string Name { get; set; }
}
public class TestModelE {
public string Name { get; set; }
}
Ecco la mia modifica - che è essenzialmente uguali ai suoi
[HttpPost]
public ActionResult Edit(FormCollection form) {
IValueProvider vpFrom = form.ToValueProvider();
Models.TestModel t = new Models.TestModel();
TryUpdateModel(t, null, null, null, vpFrom);
return View(t);
}
Tutto questo funziona esattamente come previsto con tutti i modelli creati in modo corretto. L'unico problema che posso vedere accada è che forse non sta passando gli stessi nomi proprietà indietro dal modulo. (Non utilizzando <%: Html.TextBoxFor(model => model.A.B.C.CName)%>
per esempio)
I modelli richiedono costruttori senza parametri. Ma sono sicuro che sarebbe ottenuto un errore su questo -. A meno che non si sta consumando l'errore
Quindi, senza ulteriori informazioni sul progetto, sarà difficile aiuto come una configurazione di base produce i risultati previsti.
Altri suggerimenti
Credo che il problema è in una delle classi del modello. Controllare, per favore, se PropertyB.SubPropertyB.SubSubPropertyA è davvero una proprietà, ma non è un campo. Una proprietà deve avere get e set di accesso.
Ecco la mia lista di controllo:
- Assicurati che stai ricevendo il posteriore valore nel modulo di richiesta. Richiesta [ "A.B.C.Name"] ed ecc.
- tutti i campi obbligatori sono in forma.
- ho avuto problema deleteOnNull con LINQ to SQL: Come impostare DeleteOnNull dal progettista per il futuro ref se si sta utilizzando L2SQL.