ASP.NET MVC - Personalizzata Modello Binder per i campi ID
-
30-09-2019 - |
Domanda
Ho le seguenti entità:
public class Category
{
public virtual int CategoryID { get; set; }
[Required(ErrorMessage = "Section is required")]
public virtual Section Section { get; set; }
[Required(ErrorMessage = "Category Name is required")]
public virtual string CategoryName { get; set; }
}
public class Section
{
public virtual int SectionID { get; set; }
public virtual string SectionName { get; set; }
}
Ora nel mio vista categoria add ho una casella di testo per inserire l'Idsezione ad esempio:
<%= Html.TextBoxFor(m => m.Section.SectionID) %>
Mi piacerebbe creare un modello personalizzato raccoglitore di avere la logica seguente:
Se le estremità chiave modello con ID e ha un valore (un valore è stato inserito nella casella di testo) quindi impostare l'oggetto padre (Sezione in questo esempio) per Section.GetById (valore immesso) Set altro l'oggetto padre a null.
mi piacerebbe davvero apprezzato l'aiuto qui come questo mi è stato sconcertante per un po '. Grazie
Soluzione 2
Utilizzando la soluzione postato da Dave thieben Sono venuto con la seguente:
public class CustomModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (bindingContext.ModelType.Namespace.EndsWith("Models.Entities") && value != null && (Utilities.IsInteger(value.AttemptedValue) || value.AttemptedValue == ""))
{
if (value.AttemptedValue != "")
return Section.GetById(Convert.ToInt32(value.AttemptedValue));
else
return null;
}
else
return base.BindModel(controllerContext, bindingContext);
}
}
Questo funziona bene, tuttavia non selezionare il giusto valore quando il modulo viene inviato indietro e utilizzando un elenco a discesa. Posso capire perché, ma finora i miei tentativi di risolvere il problema sono stati vani. L'apprezzerei una volta di più se potesse aiutarmi.
Altri suggerimenti
ho postato un modello legante su questa domanda che utilizza un IRepository per riempire le chiavi esterne, se sono presenti. si potrebbe modificarlo per soddisfare il vostro scopo migliore.