C# 如何在ASP.NET MVC 3中为填充的下拉列表创建视图模型

C# 如何在ASP.NET MVC 3中为填充的下拉列表创建视图模型,c#,asp.net,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc 3,我试着自学MVC3。我正在从webforms转换 我需要创建一个视图模型,其中包括一个下拉列表,我可以将其传递给控制器并最终在视图中渲染 我怎样才能做到这一点?我有框架,但我不知道实际为视图创建名称-值对的代码是什么 namespace DH.ViewModels { public class SharedLayoutViewModel { public IEnumerable<SelectListItem> Products {

我试着自学MVC3。我正在从webforms转换

我需要创建一个视图模型,其中包括一个下拉列表,我可以将其传递给控制器并最终在视图中渲染

我怎样才能做到这一点?我有框架,但我不知道实际为视图创建名称-值对的代码是什么

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>
         }
     }
  }
namespace DH.ViewModels
{
公共类SharedLayoutViewModel
{
公共可数产品
{
//一些用于设置要在视图中呈现的值/名称对的代码。
//例如:
//芥末
//番茄酱
//梅奥
//津津有味
//烧烤
}
}
}

谢谢

我更喜欢这样做

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

因此,我的视图模型只包含一个产品列表,并在视图上生成选择列表。

我将为产品创建一个类,并在我的主视图模型中创建产品属性,该属性属于列表类型

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;}    
}
在GET action中

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);
}
编辑:根据OP的请求,编辑答案,使属性以产品形式返回静态项

我向Products属性添加了一个get实现,以返回静态产品的列表

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;}
}
这是输出。


如果产品中有很多项,请将其移动到一个方法,并在get实现中调用该方法,而不是在那里编写。这是一种更简洁的方法。

为什么不能在ViewModel中使用SelectList? 它是一种包含选定值和项目列表本身的抽象。 您可以实现显示/编辑器模板,并定义属性DataTypeAttribute/UIHintAttribute将特定模板与选择列表相关联

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

谢谢你的回复。产品列表是静态的。我将在哪里创建这些值?我是在控制器中设置值列表还是在视图模型中创建静态列表?@Maddhacker24:您可以在ViewModel中创建它。如果我有以下产品,您能告诉我填充此选择列表的语法吗。番茄酱、芥末、调味品、蛋黄酱、BBQ完美。我真的很感谢你的帮助@Shyju:我创建了一个测试应用程序只是为了尝试一下,但是它不能正常工作。“testingApplication1.ViewModel.ProductViewModel”不包含名为“Value”的属性的视图上存在错误。我可以知道它有什么问题吗?SelectList是一个视图特定的构造。您可能希望在将来将视图更改为非下拉列表-因此,在下拉列表中使用该视图之前,您应该使项目的类型为ItemViewModel(具有Id和名称,而不是值和标签),此时您可以从中生成SelectListItem。否则,当您想要进行此更改时,您需要更改viewmodel(以及可能使用它的任何其他视图),而您应该只更改一个视图。查找“关注点分离”
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--")
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;}
}
    public ActionResult Order()
    {
        OrderViewModel orderVM = new OrderViewModel();           
        return View(orderVM);
    }
public class ProductViewModel
{
    public int ID { set;get;}
    public string Name { set;get;}
    public SelectList Items {get;set;}
}