2010-06-11 17 views
1

J'ai un problème suivant. Dans mon modèle de vue je définissais certaines propriétés de la liste comme suit:Comment lier Les listes d'un modèle de vue personnalisé à un dropDownList et obtenir la valeur sélectionnée après POST dans ASP.NET MVC?

public class BasketAndOrderSearchCriteriaViewModel 
{ 
    List<KeyValuePair> currencies; 
    public ICollection<KeyValuePair> Currencies 
    { 
     get 
     { 
      if (this.currencies == null) 
       this.currencies = new List<KeyValuePair>(); 
      return this.currencies; 
     } 
    } 

    List<KeyValuePair> deliverMethods; 
    public ICollection<KeyValuePair> DeliveryMethods 
    { 
     get 
     { 
      if (this.deliverMethods == null) 
       this.deliverMethods = new List<KeyValuePair>(); 
      return this.deliverMethods; 
     } 
    } 
} 

Ce modèle de vue est intégré dans un autre modèle de vue:

public class BasketAndOrderSearchViewModel 
{ 
    public BasketAndOrderSearchCriteriaViewModel Criteria 
    { 
     [System.Diagnostics.DebuggerStepThrough] 
     get { return this.criteria; } 
    } 
} 

J'utilise 2 méthodes d'action; on est pour l'EEG et l'autre pour POST:

[HttpGet] 
public ActionResult Search(BasketAndOrderSearchViewModel model){...} 

[HttpPost] 
public ActionResult SubmitSearch(BasketAndOrderSearchViewModel model){...} 

De l'avis je mets en œuvre l'ensemble du modèle de vue en utilisant l'aide EditorFor-Html qui ne veut pas afficher automatiquement DropDownLists pour les propriétés de la liste! 1. Question: Comment pouvez-vous laisser afficher EditorFor DropDownLists?

Depuis que je ne pouvais pas comprendre comment afficher DropDownLists en utilisant EditorFor, j'ai utilisé l'aide DropDownList Html et rempli par le modèle de vue comme suit:

public IEnumerable<SelectListItem> DeliveryMethodAsSelectListItem() 
    { 
     List<SelectListItem> list = new List<SelectListItem>(); 
     list.Add(new SelectListItem() 
     { 
      Selected = true, 
      Text = "<Choose Delivery method>", 
      Value = "0" 
     }); 
     foreach (var item in this.DeliveryMethods) 
     { 
      list.Add(new SelectListItem() 
      { 
       Selected = false, 
       Text = item.Value, 
       Value = item.Key 
      }); 
     } 

     return list; 
    } 

Ma 2. question: Comme vous pouvez voir je passe mon modèle de vue à l'action metho avec l'attribut POST! Existe-t-il un moyen de faire en sorte que la valeur sélectionnée d'une DropDownList soit liée au modèle de vue transmis? À l'heure actuelle, tous DropDownList sont vides et la valeur sélectionnée ne peut être récupérée que par la Request.Form que je veux absolument éviter!

J'apprécierais beaucoup quelques idées ou conseils sur ceci!

Répondre

1

Essayons de prendre celui-ci:

Réponse à la question n ° 1: Comment pouvez-vous laisser DropDownLists d'affichage EditorFor?

Lorsque vous appelez Html.EditorFor() vous pouvez transmettre des valeurs vidéotex supplémentaires à la EdiorTemplate Vue:

<%: Html.EditorFor(model => Model.Criteria, new { DeliveryMethods = Model.DeliveryMethods, Currencies = Model.Currencies}) %> 

Maintenant vous avez ViewData["DeliveryMethods"] et ViewData["Currencies"] initialisé et disponible à l'intérieur de votre EditorTemplate.

Dans votre EditorTemplate vous devez d'une manière ou d'une autre appeler et convertir ces entrées dans DropDowns/SelectLists. En supposant que vous avez un fichier ascx de type System.Web.Mvc.ViewUserControl<BasketAndOrderSearchCriteriaViewModel> vous pouvez effectuer les opérations suivantes:

<%: Html.LabelFor(model => model.DeliveryMethods) %> 
<%: Html.DropDownList("SelectedDeliveryMethod", new SelectList(ViewData["DeliveryMethods"] as IEnumerable, "SelectedDeliveryMethod", "Key", "value", Model.SelectedDeliveryMethod)) %> 

même pour les Devises.

<%: Html.LabelFor(model => model.Currencies) %> 
<%: Html.DropDownList("SelectedCurrency", new SelectList(ViewData["Currencies"] as IEnumerable, "SelectedDeliveryMethod", "Key", "value", Model.SelectedCurrency)) %> 

Cette configuration rendra votre DeliveryMethodAsSelectListItem() obsolète et vous pouvez utiliser tout type de liste. Signifie que vous n'êtes pas lié à KeyValuePairs. Vous aurez juste besoin d'ajuster votre appel sur Html.DropDownList() à partir de maintenant.

Comme vous pouvez le voir, j'ai introduit quelques nouvelles propriétés à votre BasketAndOrderSearchCriteriaViewModel:

Model.SelectedDeliveryMethod 
Model.SelectedCurrency 

Ils sont utilisés pour stocker la valeur actuellement sélectionnée.

Réponse à la question 2: Y a-t-il un moyen de faire en sorte que la valeur sélectionnée d'une DropDownList soit liée au modèle de vue passé?

Dans le modèle EditorFor nous passons les Model.SelectedDeliveryMethod et Model.SelectedCurrency nouvellement créées propriétés comme SelectedValue Parameter (Voir 4th Overload of the DropDownList Extension Method).

Maintenant que nous avons le View en train de faire son travail: Comment pouvons-nous obtenir la valeur actuellement sélectionnée dans le POST Action?

C'est vraiment facile maintenant:

[HttpPost] 
public ActionResult SubmitSearch(BasketAndOrderSearchViewModel model) 
{ 
    ... 
    var selectedDeliveryMethod = model.Criteria.SelectedDeliveryMethod; 
    var selectedCurrency model.Criteria.SelectedDeliveryMethod; 
    ... 
} 

Note: Je n'ai pas un IDE pour le tester en ce moment, mais il devrait faire l'affaire ou du moins vous montrer dans quelle direction aller.

+1

Merci pour votre réponse rapide à ma question! Cela m'a donné un bon indice dans quelle direction je dois aller! Je vais fournir ma solution finale ici quand c'est fait! – tmesi

2

Pour ceux comme moi qui ont obtenu à ce poste ces jours-ci, je vous recommande de télécharger entièrement le tutoriel de http://www.asp.net/mvc/tutorials/mvc-music-store-part-1 qui couvre cela et la plupart des techniques courantes liées aux applications .NET MVC.

Quoi qu'il en soit vraiment votre homme UTILE poste et réponses (Si je pouvais vous voter :) Je