web-dev-qa-db-fra.com

ViewModel ASP.NET MVC 4 avec données DropDownList

J'utilise @html.EditorFor pour rendre mon modèle en mode édition et aucune liste déroulante n'est rendue.

Voici mon ViewModel:

     public class RiskAutoViewModel
     {
       public RiskAutoViewModel()
       {
         VehicleMakeList = new SelectList(new List<VehicleMake>() { new VehicleMake() { Id = 1, Name = "Renault" }, new VehicleMake() { Id = 2, Name = "Peugeot" } });
       }


    public int NoClaimsDegree { get; set; }

    public int VehicleValue { get; set; }

    public int EngineCapacity { get; set; }

    public int VehicleMake { get; set; }

    public SelectList VehicleMakeList { get; set; }
  }

VehicleMake est rendu sous la forme d'un textbox et VehicleMakeList n'est pas rendu du tout. Ce que j'aimerais, c'est rendre une liste déroulante contenant la liste de VehicleMake et définir sa valeur sur celle de VehicleMake

Lorsque le modèle est enregistré, VehicleMake doit être défini sur la valeur de l'élément sélectionné dans la liste.

Comment puis je faire ça ? 

MODIFIER

Comme je ne peux taper aucun code dans les zones de commentaire ci-dessous, je vais écrire un suivi ici.

J'ai fini par créer un EditorTemplate tel que:

<div class="editor-label">
    @Html.LabelFor(model => model.VehicleMakeList)
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.VehicleMake, Model.VehicleMakeList)
    @Html.ValidationMessageFor(model => model.VehicleMake)
</div>

Et maintenant, mon ViewModel ressemble à ceci:

[Required]
[ScaffoldColumn(false)]
public int VehicleMake { get; set; }

[Display(Name = "Marque", Prompt = "Marque", Description = "Renseigne la marque du véhicule")]
public SelectList VehicleMakeList { get; set; }

Cela me conduit maintenant à une autre question (peut-être que je devrais le faire dans un autre fil), mais j'ai en réalité DEUX listes déroulantes dans cette vue. Et les éléments de la deuxième liste déroulante sont fondamentalement dynamiques et dépendent de l'élément sélectionné dans la première liste déroulante. C'est très facile à faire avec AJAX mais avec MVC, je suis perdu. Comment les gens font-ils cela habituellement?

9
Sam

Malheureusement, il n'y a pas de support intégré pour les listes déroulantes dans l'éditeur de modèles. Vous pouvez écrire votre propre modèle d'éditeur ou utiliser la méthode d'assistance HTML @Html.DropDownListFor() dans votre affichage.

La réponse de Darin Dimitrov à cette question peut vous guider tout au long du processus de création d'un modèle d'éditeur pour les listes déroulantes, si vous le souhaitez.

Le moyen le plus rapide pour que cela fonctionne est de le faire à votre avis:

@Html.EditorFor(model => model.NoClaimsDegree)
@Html.EditorFor( model => model.VehicleValue )
@Html.EditorFor( model => model.EngineCapacity )
@Html.DropDownListFor( model => model.VehicleMake, Model.VehicleMakeList, "Select a make" )
10
Forty-Two

Je pense que le modèle pour dropdownlist devrait être:

public List<System.Web.Mvc.SelectListItem> VehicleMakeList {get; set;}

Et initialisé comme:

VehicleMakeList = new List<System.Web.Mvc.SelectListItem>() 
{ 
   new SelectListItem { Value = "1", Text = "Renault" }, 
   new SelectListItem { Value = "2", Text = "Peugeot" } 
};

Ou en utilisant une source de données:

    VehicleMakeList = db.VehicleMakers /*EF, LINQ2SQL, ADO.NET or any supported external source*/
       .Select(v=> new SelectListItem { Text = v.Name, Value = v.Id})
       .ToList();

Vue:

@Html.DropDownListFor(model => model.VehicleMake, Model.VehicleMakeList)
7
JOBG

La liste déroulante de liaisons est très délicate dans MVC Vous pouvez le faire avec ceci dans votre contrôleur pour obtenir toutes vos listes de villes le mettre dans viewBag

Créer 

      ViewBag.CityId = new SelectList(db.Cities, "ID", "Name");

user.CityID si vous êtes dans Edit afin que sur edit, sélectionnez la ville

      ViewBag.CityId = new SelectList(db.Cities, "ID", "Name", user.CityID);

dans votre vue il suffit de faire cette astuce 

     @Html.DropDownList("CityId", "Select")

c'est la façon la plus simple que je connaisse ....

3
dnxit

liste déroulante de liaison est facile. code comme suit

public ActionResult BindWithModel()
{
    List<SelectListItem> items = new List<SelectListItem>();

    items.Add(new SelectListItem 
                { Text = "Select Category", Value = "0", 
                        Selected = true });
    items.Add(new SelectListItem
                { Text = "Beverages", Value = "1" });
    items.Add(new SelectListItem
                { Text = "Condiments", Value = "2" });
    items.Add(new SelectListItem
                { Text = "Confections", Value = "3" });
    items.Add(new SelectListItem
                { Text = "Dairy Products", Value = "4" });
    items.Add(new SelectListItem
                { Text = "Grains/Cereals", Value = "5" });
    items.Add(new SelectListItem
                { Text = "Meat/Poultry", Value = "6" });
    items.Add(new SelectListItem
                { Text = "Produce", Value = "7" });
    items.Add(new SelectListItem
                { Text = "Seafood", Value = "8" });

    var model = new CategoryModel()
    {
        lstCategory = items,
        selected = 1
    };

    return View(model);
}

Code en vue

@model BindMvcDropdownList.Models.CategoryModel

<h1>Bind MVC DropDownList with Model</h1>

@Html.DropDownListFor(x => x.selected, Model.lstCategory)

code extrait d'ici http://dotnetmentors.com/mvc/how-to-bind-dropdownlist-in-asp-net-mvc-application.aspx

0
Mou