Je cherche à utiliser la méthode UpdateModel pour une sous-classe récupérée lors de l'exécution, ce serait génial si quelqu'un pouvait faire la lumière si je fais un hachage total de celui-ci et/ou si oui ou non ce que j'essaie de faire est possible. J'utilise une action générique pour contrôler la validation d'un groupe de vues partielles; J'essaie d'éviter une action spécifique par vue partielle.MVC UpdateModel et sous-classes par rapport à la classe de base
Chaque vue partielle a un modèle unique qui dérive d'un modèle de base:
public class ModelA : ModelBase{
[Required]
public string SomeStringProperty{get;set;}
...
}
public class ModelB : ModelBase{
[Required]
public DateTime? SomeDateProperty{get;set;}
...
}
public class ModelBase{
public Guid InstanceId{get;set;}
}
J'utilise le FormCollection sur l'action pour obtenir les éléments de formulaire soumis et leurs valeurs, ce qui comprend le type de modèle que la vue doit utiliser pour valider sa demande. Ignorer les conséquences sur la sécurité de ce pour cet exemple, je suis au courant et c'est une preuve interne uniquement concept
[HttpPost]
public ActionResult ChangeCaseState(int id, FormCollection formCollection)
{
Guid instanceId = new Guid(formCollection["instanceId"]);
string modelType = formCollection["modelType"];
//Return a specific Model class based on the event/modelType
var args = GetStateModelClass(modelType, instanceId);
try
{
UpdateModel(args);
if(Model.IsValid){
...
}
catch (Exception)
{
return View("~/Views/Shared/StateForms/" + modelType + ".ascx", args);
}...
Et voici le code que je utilise pour retourner une classe en fonction des sous le modelType transmis au contrôleur.
private static ModelBase StateModelClassFactory(string stateModelTypeName, Guid instanceId)
{
switch (stateModelTypeName)
{
case "modelTypeA":
return new ModelA(workflowInstanceId);
case "modelTypeB":
return new ModelB(workflowInstanceId);
...
}
Parce que le type de retour de la méthode StateModelClassFactory est de la classe de base, même si je suis en fait le retour d'une classe Sub, le classeur modèle utilisé par la méthode UpdateModel se fixe seulement contre les valeurs dans la classe de base.
Des idées sur la façon dont je peux résoudre ce problème?
MISE À JOUR:
J'ai créé un modèle client Binder:
public class CustomModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
et caractérisées par le nouveau modèle Binder à la bonne classe de base pour voir ce qui se passait un peu plus sous le capot:
ModelBinders.Binders.Add(typeof(ModelBase), new CaseController.CustomModelBinder());
Lorsque je débogue le classeur de modèle et inspecte le bindingContext, la propriété Model représente le bon Sous-classe, mais la propriété ModelType est celle de la classe de base. Devrais-je envisager de changer le ModelType dans la méthode BindModel? Si tel est le cas, le setter sur le ModelType semble avoir été redondant. J'ai également remarqué que SomeDateProperty de la classe Sub est actaully dans la propriété PropertyMetadata .... semble si proche de se comporter comme je le voudrais.
+1. Merci de partager votre solution. –