问题在简单的情况下使用DropDownListFor(MVC 2.0)
问题描述:
我有一个类:问题在简单的情况下使用DropDownListFor(MVC 2.0)
public Class Color
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
我的控制器:
public ActionResult Index()
{
var _colors = colorRepository.GetAll();
return View(_colors);
}
所以,我的我有一个IEnumerable强类型的视图:
Inherits="System.Web.Mvc.ViewPage<IEnumerable<Color>>
如何使用DropDownListFor显示所有颜色?
感谢
答
你不需要DropDownListFor。 只要使用DropDownList,如果你的模型就像你描述的那样。
<% = Html.DropDownList("Colors", new SelectList(Model, "Id", "Name")) %>
如果您不喜欢字符串,请尝试构建扩展方法。
事情是这样的:
:public static class MvcExtensions
{
public static SelectList ToSelectList<T>(this IEnumerable<T> list) where T : IDropdownList
{
IEnumerable<T> result;
if (list == null)
{
result = (IEnumerable<T>) new List<EmptyDropdownList>{new EmptyDropdownList()};
}
else
{
result = list;
}
string value = Reflector.GetPropertyName<T>(x => x.Id);
string text = Reflector.GetPropertyName<T>(x => x.Text);
return new SelectList(result, value, text);
}
}
的反射器由一个惯例基于接口IDropDownList
public class Reflector
{
public static string GetPropertyName<T>(Expression<Func<T, object>> expression)
{
var lambdaEx = expression as LambdaExpression;
if (lambdaEx == null) throw new ArgumentNullException("expression");
MemberExpression memberExpression = null;
if (lambdaEx.Body.NodeType == ExpressionType.Convert)
{
var unaryExpression = lambdaEx.Body as UnaryExpression;
if (unaryExpression == null) throw new ArgumentNullException("expression");
if (unaryExpression.Operand.NodeType == ExpressionType.MemberAccess)
{
memberExpression = unaryExpression.Operand as MemberExpression;
}
}
else if (lambdaEx.Body.NodeType == ExpressionType.MemberAccess)
{
memberExpression = lambdaEx.Body as MemberExpression;
}
if (memberExpression == null) throw new ArgumentNullException("expression");
return memberExpression.Member.Name;
}
}
公约接口
public interface IDropdownList
{
int Id { get; set; }
string Text { get; set; }
}
新Color类获得的属性名称
public class Color : IDropdownList
{
public virtual int Id { get; set; }
public virtual string Text { get; set; }
}
在视图中你可以写:
<% = Html.DropDownList("Colors", Model.ToSelectList())%>
答
的DropDownListFor是的HtmlHelper为给定的类属性创建(的选择类型)的输入栏。
假设你有一个“车”对象:
class Car{
public String ColorId{get;set;}
public String Model{get;set;}
}
,你想创建一个表单编辑这种类。 在这种情况下,您将创建一个包含Car对象和颜色列表的viewModel。
class CarViewModel{
public Car Car{ get; set; }
public SelectList Colors { get; set; }
}
在控制器创建CarViewModel的一个实例,其值
public ActionResult Index()
{
var viewModel = new CarViewModel();
viewModel.Colors = new SelectList(colorRepository.GetAll(),"Id","Name");
viewModel.Car = new Car();
return View(viewModel);
}
然后,你将视图模型的wiew强类型的视图模型和视图里面,你会使用填充它DropDownListFor Helper
<% = Html.DropDownListFor(o=>o.ColorId, Model.Colors) %>