MVC5 Заполнить выпадающий список из другой таблицы

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

 public ActionResult Create()
    {
        ViewBag.ClubList = GetClubs();

        return View();
    }

    public static List<SelectListItem> GetClubs()
    {
        List<SelectListItem> ls = new List<SelectListItem>();
        var club = new ClubsService().RecordView().ToList();
        foreach (var item in club)
        {
            ls.Add(new SelectListItem { Text = item.clubID.Trim(), Value = item.clubID.Trim() });
        }

        return ls;
    }

И мой взгляд таков

  @Html.DropDownListFor(model => model.clubID, ViewBag.ClubList, new { @style = "width:400px; text-align: left", @class = "btn btn-default dropdown-toggle" })

Это вызывает ошибку

(«HtmlHelper» не содержит определения для «DropDownListFor», а лучшая перегрузка метода расширения «SelectExtensions.DropDownListFor(HtmlHelper, Expression>, IEnumerable, object)» имеет некоторые недопустимые аргументы.

ClubID берется из таблицы Clubs, где модель, которую я заполняю, берется из таблицы products.

Может ли кто-нибудь отправить меня в правильном направлении. Немного нового для MVC.

Спасибо.


person Rob    schedule 03.02.2017    source источник
comment
ViewBag является динамическим - вам нужно привести его - @Html.DropDownListFor(model => model.clubID, (IEnumareble<SelectListItem>)ViewBag.ClubList, new { ... }) (еще одна причина, по которой вы всегда должны использовать модель представления, и эта модель представления будет содержать свойство IEnumerable<SelectListItem>   -  person    schedule 03.02.2017
comment
И обратите внимание, что тег model-view-controller предназначен для вопросов о шаблоне. Для реализации ASP.NET-MVC существует специальный тег.   -  person    schedule 03.02.2017


Ответы (3)


я использую другой способ предотвратить цикл и получить ожидаемый результат

var club = new ClubsService().RecordView().ToList();
ViewBag.ClubList = new SelectList(club, "clubID", "clubID");

первый clubID определяет значение, а второй clubID определяет текст, я использовал оба clubID, потому что в вашем примере вы использовали item.clubID и в представлении

  @Html.DropDownListFor(model => model.clubID, (SelectList)ViewBag.ClubList,"-- Select Clubs --", new { @style = "width:400px; text-align: left", @class = "btn btn-default dropdown-toggle" })
person Usman    schedule 03.02.2017

Вместо использования ViewBag, почему бы не создать ViewModel для вашего представления, добавить свойство в ViewModel, которое является selectList

public string ClubID {get; set;}
public SelectList ClubList { get; set; }

Вы можете добавить все поля, которые ваше представление будет использовать в этой модели. Убедитесь, что вы инициализировали SelectList в конструкторе ViewModel.

ClubList = new SelectList();

Затем внутри вашего контроллера создайте экземпляр модели представления, получите данные и передайте их в представление:

public ActionResult Create()
{
    var model = new MyViewModel();
    model.ClubList = GetClubs();

    return View(model);
}

public static SelectList GetClubs()
{

    var club = new ClubsService().RecordView().ToList();
    var ls = new SelectList(club, "clubID", "clubID");
    return ls;
}

И в вашем представлении, наверху, вы можете сказать:

@model namespace.Where.ViewModel

тогда вы можете сказать:

@Html.DropDownListFor(model => model.clubID, Model.ClubList, "Please Select...", new { @style = "width:400px; text-align: left", @class = "btn btn-default dropdown-toggle" })
person Duly Kinsky    schedule 03.02.2017

Ваш файл представления не знает о public static List<SelectListItem> GetClubs(). Добавьте свое пространство имен в файл web.config в корне папок вашего представления:

<pages>
    <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
        <add namespace="System.Web.WebPages"/>
        <add namespace="System.Web.Helpers"/>
        <!--ADD YOUR NAMESPACE HERE-->
        <add namespace="MyCustomHelpers"/>
    </namespaces>
</pages>
person Matt Spinks    schedule 03.02.2017
comment
В этом нет необходимости — значение присваивается свойству ViewBag в контроллере. - person ; 03.02.2017