2009-09-02 3 views
3

Je me demande s'il existe un bon exemple de modification des paramètres du profil ASP.NET dans MVC en utilisant la liaison de modèle.Modèle ASP.NET lié à ProfileCommon

Actuellement, j'ai:

  • une classe ProfileCommon personnalisée dérivée de ProfileBase.
  • une vue fortement typée (de type ProfileCommon)
  • obtenir et publier des actions sur le contrôleur qui fonctionnent avec ProfileCommon et la vue associée. (voir le code ci-dessous).

Affichage des détails du profil fonctionne - le formulaire apparaît tous les champs sont correctement remplis.

Cependant, l'enregistrement du formulaire donne une exception: System.Configuration.SettingsPropertyNotFoundException: La propriété de paramètres 'FullName' est introuvable. En pensant à cela, il est logique que la liaison de modèle instancie la classe ProfileCommon elle-même au lieu de saisir celle du contexte httpcontext. De plus, la sauvegarde est probablement redondante car je pense que le profil se sauvegarde automatiquement lorsqu'il est modifié - un dans le cas, probablement même si la validation échoue. Droite? En tout cas, mon idée actuelle est que j'ai probablement besoin de créer une classe Profile séparée pour la liaison du modèle, mais cela semble un peu redondant quand j'ai déjà une classe très similaire.

Y a-t-il un bon exemple pour cela quelque part?

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Edit() 
    { 
     return View(HttpContext.Profile); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(ProfileCommon p) 
    { 
     if (ModelState.IsValid) 
     { 
      p.Save(); 
      return RedirectToAction("Index", "Home"); 
     } 
     else 
     { 
      return View(p); 
     } 
    } 

Répondre

3

Il semble correct quand vous dites que l'instance ProfileCommon est créé à partir de zéro (pas de HttpContext) dans le scénario post - c'est ce que le DefaultModelBinder fait: il crée une nouvelle instance du type en fonction de sa valeur par défaut constructeur.

Je pense que vous pouvez résoudre ce problème en créant un IModelBinder personnalisé qui ressemble à ceci:

public class ProfileBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
    { 
     return controllerContext.HttpContext.Profile; 
    } 
} 

Vous devrez peut-être faire un peu de casting pour l'adapter à votre classe de profil.

Pour utiliser ce ProfileBinder, alors vous pouvez l'ajouter à votre Modifier l'action du contrôleur comme ceci:

public ActionResult Edit([ModelBinder(typeof(ProfileBinder))] ProfileCommon p) 
+0

Merci Mark, je pense que ce serait probablement travailler mais je pense que je suis tenté de le faire dans le mauvais sens . Le problème est que si des vérifications de validation sur la classe ProfileCommon échouent, les modifications sont déjà appliquées, l'objet étant marqué comme sale et écrit de toute façon. J'ai résolu ceci maintenant en utilisant une deuxième classe similaire (ProfileEdit) qui a la logique de validation et les méthodes à appliquer à/de la classe ProfileCommon. C'est plus de code mais il se sépare bien et ça marche. –

Questions connexes