Как создать модель представления для заполненного выпадающего списка в ASP.NET MVC 3

Я пытаюсь научить себя MVC3. Im преобразование из веб-форм.

Мне нужно создать модель представления, которая включает раскрывающийся список, который я могу передать контроллеру и в конечном итоге сделать в представлении.

Как я могу это сделать? У меня есть скелет, но я не знаю, что именно на самом деле создает пары имен для представления.

namespace DH.ViewModels
{
    public class SharedLayoutViewModel
    {
        public IEnumerable<SelectListItem> Products
        {
            //some code to setup the value/name pairs to be rendered in the view.
            //example: 
            //<option value="1">Mustard</option>
            //<option value="2">Ketchup</option>
            //<option value="3">Mayo</option>
            //<option value="4">Relish</option>
            //<option value="5">BBQ</option>
         }
     }
  }

Спасибо

Ответы

Ответ 1

Я бы создал класс для Product и создать свойство Products в моей главной модели просмотра, которая имеет тип List

public class ProductViewModel
{
  public int ID { set;get;}
  public string Name { set;get;}
}

public class OrderViewModel
{
  public int OrderNumber { set;get;}
  public List<ProductViewModel> Products { set;get;}
  public int SelectedProductId { set;get;}    
}

и в вашем методе действий с контроллером

public ActionResult Order()
{     
   var orderVM=new OrderViewModel();
   //Items hard coded for demo. You may replace with values from your db
   orderVM.Products= new List<ProductViewModel>
    {
        new ProductViewModel{ ID=1, Name="IPhone" },
        new ProductViewModel{ ID=2, Name="MacBook Pro" },
        new ProductViewModel{ ID=3, Name="iPod" }           
    };
   return View(orderVM);
}

и в вашем представлении, который строго типизирован для OrderViewModel.

@model ORderViewModel
@using (Html.BeginForm())
{
  <p> 
    @Html.DropDownListFor(x => x.SelectedProductId ,
                     new SelectList(Model.Products, "ID", "Name"), "-- Select Product--")
  </p>
  <input type="submit" />
}

Я добавил свойство SelectedProductId, поэтому вы получите выбранное пользователем значение из раскрывающегося списка в этом "Свойстве", когда пользователь отправит форму обратно в контроллер.

Вы также можете использовать общий набор типов SelectListItem в качестве свойства модели просмотра для переноса выпадающих данных вместо вашей пользовательской коллекции ProductViewModel.

public class OrderViewModel
{
  public int OrderNumber { set;get;}
  public List<SelectListItem> Products { set;get;}
  public int SelectedProductId { set;get;}    
}

и в действии GET,

public ActionResult Order()
{     
   var orderVM=new OrderViewModel();
   //Items hard coded for demo. You may replace with values from your db
   orderVM.Products= new List<SelectListItem>
    {
        new SelectListItem {Value = "1", Text = "IPhone"},
        new SelectListItem {Value = "2", Text = "MacBook"},
        new SelectListItem {Value = "3", Text = "Candy"}
    };
   return View(orderVM);
}

И, на ваш взгляд,

@Html.DropDownListFor(x => x.SelectedProductId, Model.Products, "-- Select Product--")

РЕДАКТИРОВАТЬ: В соответствии с запросом от OP отредактирован ответ, чтобы свойство возвращало статические элементы в качестве продуктов

Я добавил реализацию реализации в свойство Products, чтобы вернуть список статических продуктов.

public class OrderViewModel
{
        private List<ProductViewModel> _products;
        public int OrderNumber { set; get; }
        public List<ProductViewModel> Products
        {
            get
            {
                if (_products == null)
                {
                    _products = new List<ProductViewModel>();
                    _products.Add(new ProductViewModel { ID = 1, Name = "Ketchup" });
                    _products.Add(new ProductViewModel { ID = 1, Name = "Mustard" });
                    _products.Add(new ProductViewModel { ID = 1, Name = "Relish" });
                    _products.Add(new ProductViewModel { ID = 1, Name = "Mayo" });
                }
                return _products;
            }
        }
       public int SelectedProductId { set;get;}
}

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

    public ActionResult Order()
    {
        OrderViewModel orderVM = new OrderViewModel();           
        return View(orderVM);
    }

Вот результат. enter image description here

Если у вас много элементов в продуктах, переместите их в метод и вызовите этот метод int, он получает реализацию вместо того, чтобы писать там. Это намного более чистый подход.

Ответ 2

Я предпочитаю делать это таким образом.

@Html.DropDownListFor(m => m.ProductId, new SelectList(Model.Products, "ID", "Name"))

Итак, моя модель просмотра просто содержит список продуктов и генерирует список выбора в представлении.

Ответ 3

Почему вы не можете использовать SelectList в своей ViewModel? Это своего рода абстракция, которая содержит выбранное значение и список элементов. Вы можете реализовать шаблоны Display/Editor и определить атрибут DataTypeAttribute/UIHintAttribute связать конкретный шаблон с Select List.

public class ProductViewModel
{
    public int ID { set;get;}
    public string Name { set;get;}
    public SelectList Items {get;set;}
}