Вам не нужно 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())%>