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

时间:2010-11-05 19:04:11

标签: c# asp.net-mvc-2

我有那个班级:

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 个答案:

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