Comment lier les listes d'un modèle de vue personnalisée à un DROPDOWNLIST une obtenir la valeur sélectionnée après le POST dans ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/3020897

Question

Je le problème suivant. Dans mon modèle de vue je définissais certaines propriétés de la liste comme suit:

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 modes d'action; on est pour l'EEG et l'autre pour POST:

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

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

Dans la vue je mettre en œuvre l'ensemble du modèle de vue en utilisant l'aide EditorFor-Html qui ne veut pas afficher automatiquement DropDownLists pour Liste des propriétés! 1. Question: Comment pouvez-vous laisser DropDownLists d'affichage EditorFor

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 le voir, je passe mon modèle en vue de la métho d'action avec l'attribut POST! Y at-il un moyen d'obtenir la valeur sélectionnée d'un DropDownList get binded au modèle de vue passé? À l'heure actuelle tous les DropDownList sont vides et la valeur sélectionnée ne peut être récupérée par le Request.Form que je veulent absolument éviter!

J'apprécierais beaucoup des idées ou des conseils à ce sujet!

Était-ce utile?

La solution

essayer de Let prendre sur celui-ci:

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

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 que vous avez ViewData["DeliveryMethods"] et ViewData["Currencies"] initialisé et disponible à l'intérieur de votre EditorTemplate.

Dans votre EditorTemplate vous avez besoin d'une certaine façon d'appeler et de convertir ces entrées en Dropdowns / SelectLists. En supposant que vous avez un fichier ascx de type System.Web.Mvc.ViewUserControl<BasketAndOrderSearchCriteriaViewModel> vous pouvez faire ce qui suit:

<%: 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 any type de liste. Les moyens que vous ne sont pas liés à KeyValuePairs. Vous aurez juste besoin d'ajuster votre appel 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 sélectionnée.

Réponse à la question 2: Y at-il un moyen d'obtenir la valeur sélectionnée d'un DropDownList get binded au modèle de vue passé

Dans le modèle EditorFor nous passons nouvellement créé des propriétés Model.SelectedDeliveryMethod et Model.SelectedCurrency comme SelectedValue Parameter (Voir 4ème surcharge de la Méthode d'extension DropDownList).

Maintenant que nous avons la vue de le faire du travail: Comment peut-on obtenir la valeur actuellement sélectionnée dans le POST Action

Ceci 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

Autres conseils

Pour ceux qui, comme moi qui sont à ce poste ces jours, je vous recommande de télécharger entièrement le tutoriel qui couvre cela et la plupart des techniques communes avec .NET liées applications MVC.

Quoi qu'il en soit vraiment UTILE votre message et l'homme de réponses (Si je pouvais vous voter je le ferais:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top