3 votes

Action renvoyant une vue partielle et un modèle

Je suis nouveau dans MVC 3 et j'ai une question concernant l'approche correcte.

Imaginez que j'ai un modèle:

public class MonModelePersonnalise
{
       [Required]
        public string NomUtilisateur { get; set; }

        [Required]
        public DateTime? DateNaissance { get; set; }

        [Required]
        public string Ville {get;set;} //Vers la vue partielle

        [Required]
        public string Rue {get;set;} //Vers la vue partielle  
  }

Et ici j'ai une vue

@Html.TextBoxFor(m => m.NomUtilisateur) @Html.TextBoxFor(m => m.DateNaissance) @Html.Action("GroupeLocalisation", "Accueil") //Ici la ville et la rue devraient être rendues

Ma vue partielle ressemblera à ceci: @Html.TextBoxFor(m => m.Ville) @Html.TextBoxFor(m => m.Rue)

Et voici l'action dans le contrôleur:

    [ChildActionOnly]
    public ActionResult GroupeLocalisation()
    {
        MonModelePersonnalise modele = new MonModelePersonnalise (); //Dois-je vraiment instancier une nouvelle instance du modèle et la passer à la vue partielle
        return PartialView("_VueTemporaire", modele);
    }

Essentiellement, ma vue générale aura tous les champs avec des zones de texte, mais maintenant dans ma vue partielle, je voudrais également que certaines de ces propriétés de mon modèle soient rendues correctement et après la soumission du formulaire, elles doivent être disponibles dans le même modèle que toutes les autres propriétés.

Donc ma question, dans l'action qui renvoie la vue partielle, dois-je vraiment instancier une nouvelle instance du modèle? Mais alors les données seront divisées entre 2 instances du modèle, non?

Comment organiser cela, comment puis-je ensuite ajouter les données au modèle de vue générale à partir de la vue partielle?

6voto

Dakait Points 2405

Je n'ai pas compris votre question mais vous pouvez annoter les ActionResults avec HttpGet et HttpPost ayant les mêmes noms (mais des signatures différentes, car ce sont des méthodes après tout) comme

 [HttpGet]
 [ChildActionOnly]
    public ActionResult LocationGroup()
    {
        Model model = new Model();
        return PartialView("_TempView", model);
    }

dans la vue, vous devez faire quelque chose comme

@model VOTRE_MODELE
@using(Html.BeginForm("LocationGroup","Controller",FormMethod.POST)){
 @Html.TextBoxFor(x=>x.UserName)
 @Html.TextBoxFor(x=>x.Birthdate )

}

désormais définir un ActionResult de type post

 [HttpPost]
 [ChildActionOnly]
public ActionResult LocationGroup(VOTRE_TYPE_DE_MODELE model)
{
    if(ModelState.IsValid){
     //faire quelque chose
    }
}

le liant de modèle par défaut recherchera dans le HttpContext la correspondance entre les noms des valeurs postées et les propriétés de votre modèle et liera automatiquement la valeur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X