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