2

j'ai les entités suivantes:ASP.NET MVC - Modèle personnalisé Binder pour les champs d'identification

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; } 
} 

maintenant à mon avis Ajouter une catégorie j'ai une zone de texte pour entrer dans le SectionID par exemple:

<%= Html.TextBoxFor(m => m.Section.SectionID) %> 

Je souhaite créer un classeur de modèle personnalisé avec la logique suivante:

Si la clé de modèle se termine par ID et a une valeur (une valeur a été insérée dans la zone de texte), définissez l'objet parent (Section dans cet exemple)) à Section.GetById (valeur entrée) autrement définir l'objet parent à null.

J'apprécierais vraiment l'aide ici car cela m'a déconcerté pendant un moment. Merci

Répondre

1

En utilisant la solution affichée par dave thieben je suis venu avec les éléments suivants:

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); 
    } 
} 

Cela fonctionne bien, mais il ne choisit pas la bonne valeur lorsque le formulaire est affiché en arrière et en utilisant un menu déroulant liste. Je peux voir pourquoi mais jusqu'ici mes tentatives pour le réparer ont été vaines. J'apprécierais une fois de plus si vous pouviez m'aider.

+0

si vous travaillez encore sur ceci, dans l'instruction 'if' vous avez' value.AttemptedValue == "" 'et ensuite sur la ligne suivante vous avez' value.AttemptedValue! = "" ', Donc ça ressemble à ça n'atteindrait jamais votre code Section.GetById(). –

+0

Merci encore pour votre suggestion, mais la logique est correcte, même si elle pourrait faire avec un peu de rangement pour le rendre plus lisible. La solution au problème consistait à créer un DropDownList personnalisé qui gère la propriété Selected d'un objet SelectItem. J'espère qu'ils vont corriger le bug dans la prochaine version de MVC. – nfplee

+0

J'ai un classeur modèle personnalisé [voir ici] (http://stackoverflow.com/questions/19280598/best-way-to-do-partial-update-to-net-mvc-4-model/19297099#19297099) qui tente de trier les propriétés afin que les champs d'identité soient toujours liés en premier. Je laisse la classe du modèle de vue réelle - dans ses configurateurs de propriétés - déclencher sa propre charge de dépôt plutôt que de le faire par le classeur personnalisé. (après avoir relu votre O.P. Je réalise que ce n'est pas un ajustement total, mais, peut-être donnera une idée à quelqu'un d'autre) – bkwdesign

2

J'ai posté un classeur modèle sur this question qui utilise un IRepository pour remplir les clés étrangères si elles sont présentes. vous pourriez le modifier pour mieux vous adapter à votre objectif.

+0

Merci pour le lien. Cela m'a vraiment aidé dans ce que j'ai jusqu'ici. Si vous pouviez vérifier ma tentative de solution et aider à la compléter ce serait grandement apprécié :). – nfplee