Asp.Net MVC с раскрывающимся списком и поддержкой SelectListItem

Я пытаюсь создать раскрывающийся список, но борюсь с рендерингом Html.DropDownList.

У меня есть класс:

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

Это в основном моя модель взгляда на данный момент. Список учетных записей и свойство для возврата выбранного элемента.

В моем контроллере я готовлю данные следующим образом:

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);
}

Теперь проблема:

Затем я пытаюсь создать раскрывающийся список, на мой взгляд:

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

Я получаю следующую ошибку:

Элемент ViewData с ключом SelectedAccountId имеет тип System.Int32, но должен иметь тип IEnumerable.

Зачем мне возвращать весь список товаров? Мне просто нужно выбранное значение. Как мне это делать?


person Craig    schedule 28.01.2011    source источник


Ответы (2)


У вас есть модель представления, для которой ваше представление строго типизировано => используйте строго типизированные помощники:

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

Также обратите внимание, что я использую SelectList для второго аргумента.

И в действии вашего контроллера вы возвращали модель представления, переданную в качестве аргумента, а не ту, которую вы создали внутри действия, для которого правильно настроено свойство Accounts, поэтому это может быть проблематичным. Немного почистил:

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);
}
person Darin Dimitrov    schedule 28.01.2011
comment
Спасибо @Darin Dimitrov - Это сработало, но я не уверен, что было не так с моей попыткой. Вы можете объяснить? - person Craig; 29.01.2011
comment
@cdotlister, не уверен, но проблема могла быть связана с тем, что вы передавали неправильную модель своему действию контроллера. - person Darin Dimitrov; 29.01.2011
comment
Спасибо. Заметил это сразу после публикации. - person Craig; 29.01.2011
comment
Я пытаюсь воспроизвести тот же код с помощью Selected, но не могу выбрать значение по умолчанию. Значение Select явно = true для одного элемента, но оно не отображается как выбранное на экране. - person fix105; 01.03.2013

Шаг 1. Ваш модельный класс

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;
        }
}

Шаг 2. Вызовите этот метод, чтобы заполнить раскрывающееся меню в действии контроллера

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

Шаг 3. Заполните раскрывающийся список просмотра следующим образом

 @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-")
person Kush Kant Dayal Pune    schedule 27.06.2014
comment
Mine выдает ошибку в cshtml, что он не может преобразовать группу методов в IEnumerable. - person Daniel Jackson; 09.04.2018