我有那个班级:
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 显示所有颜色?
由于
答案 0 :(得分: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);
}
}
Reflector通过基于约定的接口 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; }
}
new Color class:
public class Color : IDropdownList
{
public virtual int Id { get; set; }
public virtual string Text { get; set; }
}
在视图中你可以写:
<% = Html.DropDownList("Colors", Model.ToSelectList())%>
答案 1 :(得分:1)
DropDownListFor 是一个HtmlHelper,用于为给定的类属性创建输入字段(选择类型)。
假设您有一个“Car”对象:
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);
}
然后将viewModel传递给viewModel上强类型的wiew,在该视图中你将使用 DropDownListFor Helper
<% = Html.DropDownListFor(o=>o.ColorId, Model.Colors) %>