2010-07-04 15 views
1

J'ai des entrées pour une énumération stockée dans une table de base de données avec uniquement les champs suivants: ID et Name. Je veux montrer les valeurs stockées dans cette table dans un DropDownList sur un formulaire. L'utilisateur choisit ensuite une valeur et soumet le formulaire.Création d'une DropDownList à partir d'entrées de base de données, puis liaison dans la soumission de formulaire

I found a way to easily create a DropDownList from an enumeration (bien qu'il soit préférable de remplir simplement DropDownList avec les champs Nom de tous les enregistrements de la table). Cependant, je n'ai pas trouvé un moyen de lier le DropDownList dans la soumission de formulaire à une valeur entière à mettre dans la base de données (FK - PK) avec les autres valeurs de formulaire.

Pouvez-vous fournir un exemple de code illustrant comment effectuer une telle liaison?

MISE À JOUR: Merci pour la réponse géniale. Je ai une autre question: est-il possible de aller chercher du contenu DropDownList via AJAX et doit-il être mis dans le DropDownList et dans la SelectList dans le ViewModel (avec les deux paramètres ID et Name)? Je souhaite récupérer le contenu de manière sélective en fonction d'une entrée que l'utilisateur crée et je souhaite que ViewModel soit ensuite rempli avec ces données extraites.

Répondre

2

Comme toujours commencer par la définition d'un modèle:

public class MyViewModel 
{ 
    public int SelectedValue { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

le régulateur:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      // TODO: Fetch from the database some enumerable collection 
      // containing Id and Name 
      Items = new SelectList(new[] 
      { 
       new { Id = 1, Name = "item 1" }, 
       new { Id = 2, Name = "item 2" }, 
      }, "Id", "Name") 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     // TODO: Do something with model.SelectedValue 
     return RedirectToAction("index"); 
    } 
} 

et enfin la vue fortement typé:

<% using (Html.BeginForm()) { %> 
    <%: Html.DropDownListFor(x => x.SelectedValue, Model.Items) %> 
    <input type="submit" value="OK" /> 
<% } %> 
+0

Est-ce * que * facile? C'est ce qu'on appelle un modèle de vue, non? J'ai traversé un tel terme, mais je n'ai jamais su ce que cela signifiait et que c'était aussi facile à utiliser que cela. C'est bien que ASP.NET MVC ait un si bon classeur. –

+3

View Model est une classe que vous fournissez pour refléter la vue (données qui seront affichées/éditées), de sorte qu'elle est étroitement liée à la vue. D'autre part, le modèle représente votre logique métier. Il peut s'agir d'une classe représentant des entités commerciales et contenant beaucoup plus de champs affichés dans la vue. Vos référentiels fonctionnent généralement avec des modèles. Ainsi, dans votre contrôleur, vous utiliseriez un référentiel pour extraire un objet de modèle, le mapper à un modèle de vue et passer ce modèle de vue à la vue. Sur une autre action du contrôleur, vous pouvez récupérer le même modèle mais le mapper sur un modèle de vue différent. –

+0

Merci beaucoup pour votre aide! Une question rapide: si je décore les propriétés de mon ViewModel avec des attributs de validation (tels que RequiredAttributes), est-ce qu'elles s'appliquent uniquement lorsque le formulaire est soumis et que ViewModel est retourné au Controller ou va-t-il casser mon code? Instance ViewModel dans la partie HttpGet? –