Проблема использования DropDownListFor в простой ситуации (MVC 2.0) - PullRequest
0 голосов
/ 05 ноября 2010

У меня есть этот класс:

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);
}

Итак, у меня есть представление со строгим типом IE:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<Color>>

Как я могу использовать DropDownListFor , чтобы показать все цвета?

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 ноября 2010

Вам не нужно 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; }
}

новый Цветовой класс:

public class Color : IDropdownList
{
    public virtual int Id { get; set; }
    public virtual string Text { get; set; }
}

В представлении вы могли бы написать:

<% = Html.DropDownList("Colors", Model.ToSelectList())%>
1 голос
/ 06 ноября 2010

DropDownListFor - это HtmlHelper для создания поля ввода (выбранного типа) для данного свойства класса.

Предположим, у вас есть объект "Car":

class Car{
  public String ColorId{get;set;}
  public String Model{get;set;}
}

и вы хотите создать форму для редактирования этого типа класса.В этом случае вы создадите viewModel, который содержит объект Car и список цветов .

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, и внутри этого представления вы будете использовать DropDownListFor Helper

<% = Html.DropDownListFor(o=>o.ColorId, Model.Colors) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...