2010-07-25 3 views
4

Je suis le tutoriel Scott Guthries MVC (http://nerddinnerbook.s3.amazonaws.com/Part6.htm) et il y a quelque chose que je ne comprends pas.ASP.NET MVC NerdDinner Tutoriel question

la classe contrôleur appelé DinnersController a les méthodes suivantes Créer:

public ActionResult Create() 
    { 
     Dinner dinner = new Dinner() 
     { 
      EventDate = DateTime.Now.AddDays(7) 
     }; 

     return View(new DinnerFormViewModel(dinner)); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(Dinner dinner) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       dinner.HostedBy = "SomeUser"; 
       dinnerRepository.Add(dinner); 
       dinnerRepository.Save(); 

       return RedirectToAction("Details", new { id = dinner.DinnerID }); 
      } 
      catch 
      { 
       foreach (var violation in dinner.GetRuleViolations()) 
        ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);      
      } 
     } 

     return View(new DinnerFormViewModel(dinner)); 
    } 

La première méthode provoque la page Create.aspx à être vues qui affiche les données de formulaire pour le type d'objet-à-dire « DinnerViewFormModel »

La classe 'DinnerViewFormModel' contient une propriété appelée 'Dinner', affichant les informations pertinentes pour les objets de type Dinner en appelant:

<label for="Title">Title:</label> <%= Html.TextBox("Title", Model.Dinner.Title) %>

Je comprends ce qui se passe à ce jour. Cependant, Create.aspx contient un bouton de type submit:

<input type="submit" value="Create" />

Lorsque le bouton est cliqué, la méthode suivante est appelée:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(Dinner dinner) 

Ce que je ne comprends pas, si la forme de Les données du modèle sont un objet 'DinnerViewFormModel', comment MVC sait-il quel objet 'Dinner' doit être passé à la méthode Create?

S'il vous plaît quelqu'un pourrait m'éclairer? Merci

+0

Lire http://weblogs.asp.net/nmarun/archive/2010/02/25/asp-net-mvc-model-binding.aspx - Je pense que c'est un très bon article sur le sujet . – Carson63000

Répondre

3

AFAIK, MVC essaie juste de mapper les propriétés qui sont disponibles dans le POST au paramètre qu'il est fourni. Pour cette raison, il n'a pas besoin de connaître le type, il crée simplement l'objet avec le constructeur par défaut et mappe les valeurs du formulaire à l'objet créé - et c'est ce que vous obtenez en tant que valeur du paramètre de la méthode. Par ailleurs, vous remarquerez que la sortie de la vue ne contient aucune référence aux classes Dinner ou DinnerFormViewModel.

+0

Ok, c'est logique. Il savait qu'il devait y avoir une réponse directe. Merci pour votre aide – xiang

4

Il est appelé "Model Binding" et est intégré dans ASP.NET MVC. Vos méthodes d'action ont besoin de données et la requête HTTP entrante contient les données dont vous avez besoin. Le problème est que les données sont intégrées dans des valeurs de formulaire POST-ed, et éventuellement l'URL elle-même. Entrez le DefaultModelBinder, qui peut convertir par magie les valeurs de formulaire et acheminer les données dans des objets. Les classeurs de modèle permettent à votre code de contrôleur de rester clairement séparé de la saleté d'interroger la demande et son environnement associé.