web-dev-qa-db-fra.com

Asp.Net MVC avec liste déroulante et assistance SelectListItem

J'essaie de créer une liste déroulante, mais je me bats avec le rendu Html.DropDownList.

J'ai un cours:

public class AccountTransactionView
{
    public IEnumerable<SelectListItem> Accounts { get; set; }
    public int SelectedAccountId { get; set; }
}

C'est essentiellement mon modèle de vue pour l'instant. La liste des comptes et une propriété pour renvoyer l'élément sélectionné.

Dans mon contrôleur, je prépare les données comme ceci:

public ActionResult AccountTransaction(AccountTransactionView model)
{
    List<AccountDto> accounts = Services.AccountServices.GetAccounts(false);

    AccountTransactionView v = new AccountTransactionView
    {
        Accounts = (from a in accounts
                    select new SelectListItem
                    {
                        Text = a.Description,
                        Value = a.AccountId.ToString(),
                        Selected = false
                    }),
    };

    return View(model);
}

Maintenant le problème:

J'essaie alors de construire le menu déroulant à mon avis:

<%=Html.DropDownList("SelectedAccountId", Model.Accounts) %>

Je reçois l'erreur suivante:

L'élément ViewData qui a la clé "SelectedAccountId" est de type "System.Int32" mais doit être de type "IEnumerable".

Pourquoi voudrait-il que je retourne la liste complète des articles? Je veux juste la valeur sélectionnée. Comment dois-je faire cela?

14
Craig

Vous avez un modèle de vue dans lequel votre vue est fortement typée => utilisez des assistants fortement typés:

<%= Html.DropDownListFor(
    x => x.SelectedAccountId, 
    new SelectList(Model.Accounts, "Value", "Text")
) %>

Notez également que j'utilise un SelectList pour le deuxième argument.

Et dans votre action de contrôleur, vous renvoyiez le modèle de vue passé en argument et non celui que vous avez construit à l'intérieur de l'action qui avait la propriété Comptes correctement configurée, ce qui pouvait être problématique. Je l'ai nettoyé un peu:

public ActionResult AccountTransaction()
{
    var accounts = Services.AccountServices.GetAccounts(false);
    var viewModel = new AccountTransactionView
    {
        Accounts = accounts.Select(a => new SelectListItem
        {
            Text = a.Description,
            Value = a.AccountId.ToString()
        })
    };
    return View(viewModel);
}
30
Darin Dimitrov

Étape 1: votre classe modèle

public class RechargeMobileViewModel
    {
        public string CustomerFullName { get; set; }
        public string TelecomSubscriber { get; set; }
        public int TotalAmount { get; set; }
        public string MobileNumber { get; set; }
        public int Month { get; set; }
        public List<SelectListItem> getAllDaysList { get; set; }

        // Define the list which you have to show in Drop down List
        public List<SelectListItem> getAllWeekDaysList()
        {
            List<SelectListItem> myList = new List<SelectListItem>();
            var data = new[]{
                 new SelectListItem{ Value="1",Text="Monday"},
                 new SelectListItem{ Value="2",Text="Tuesday"},
                 new SelectListItem{ Value="3",Text="Wednesday"},
                 new SelectListItem{ Value="4",Text="Thrusday"},
                 new SelectListItem{ Value="5",Text="Friday"},
                 new SelectListItem{ Value="6",Text="Saturday"},
                 new SelectListItem{ Value="7",Text="Sunday"},
             };
            myList = data.ToList();
            return myList;
        }
}

Étape 2: appelez cette méthode pour remplir la liste déroulante de votre action de contrôleur

namespace MvcVariousApplication.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
              RechargeMobileViewModel objModel = new RechargeMobileViewModel();
                objModel.getAllDaysList = objModel.getAllWeekDaysList();  
                return View(objModel);
            }
    }
    }

Étape 3: remplissez votre liste déroulante de vue comme suit

 @model MvcVariousApplication.Models.RechargeMobileViewModel
    @{
        ViewBag.Title = "Contact";
    }
    @Html.LabelFor(model=> model.CustomerFullName)
    @Html.TextBoxFor(model => model.CustomerFullName)

    @Html.LabelFor(model => model.MobileNumber)
    @Html.TextBoxFor(model => model.MobileNumber)

    @Html.LabelFor(model => model.TelecomSubscriber)
    @Html.TextBoxFor(model => model.TelecomSubscriber)

    @Html.LabelFor(model => model.TotalAmount)
    @Html.TextBoxFor(model => model.TotalAmount)

    @Html.LabelFor(model => model.Month)
    @Html.DropDownListFor(model => model.Month, new SelectList(Model.getAllDaysList, "Value", "Text"), "-Select Day-")
16