2010-11-05 59 views
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顯示所有顏色?

感謝

回答

2

你不需要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())%> 
1

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) %>