问题在简单的情况下使用DropDownListFor(MVC 2.0)

问题在简单的情况下使用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) %>