Использование SelectList без волшебных строк - PullRequest
3 голосов
/ 30 марта 2011

Существует ли простой способ отказаться от использования волшебных строк при создании списка выбора, как в этом примере:

@Html.DropDownListFor( model => model.FooValue, new SelectList( Model.FooCollection,  "FooId", "FooText", Model.FooValue) )

Волшебными строками являются "FooId" и "FooText"

Остальная часть примера определяется следующим образом:

//Foo Class
public class Foo {

  public int FooId { get; set; }
  public string FooText { get; set; }

}    

// Repository
public class MsSqlFooRepository : IFooRepository {

  public IEnumerable<Foo> GetFooCollection( ) {

    // Some database query

  }

}

//View model
public class FooListViewModel {

  public string FooValue { get; set; }
  public IEnumerable<Foo> FooCollection { get; set; }

}

//Controller
public class FooListController : Controller {

  private readonly IFooRepository _fooRepository;

  public FooListController() {

    _fooRepository = new FooRepository();

  }

  public ActionResult FooList() {

    FooListViewModel fooListViewModel = new FooListViewModel();

    FooListViewModel.FooCollection = _fooRepository.GetFooCollection;

    return View( FooListViewModel);

  }

}

Ответы [ 3 ]

3 голосов
/ 10 августа 2011

Используя метод расширения и мощь лямбда-выражений, вы можете сделать это:

@Html.DropDownListFor(model => model.FooValue, Model.FooCollection.ToSelectList(x => x.FooText, x => x.FooId))

Метод расширения следующий:

public static class SelectListHelper
{
    public static IList<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value)
    {
        var items = enumerable.Select(f => new SelectListItem()
        {
            Text = text(f),
            Value = value(f)
        }).ToList();
        items.Insert(0, new SelectListItem()
        {
            Text = "Choose value",
            Value = string.Empty
        });
        return items;
    }
}
0 голосов
/ 02 февраля 2016

В C # 6 вы можете воспользоваться nameof и легко избавиться от этих магических струн.

... = new SelectList(context.Set<User>(), nameof(User.UserId), nameof(User.UserName));
0 голосов
/ 01 апреля 2011

Я использую View Models, поэтому у меня есть следующие свойства для моего раскрывающегося списка FooValues:

public SelectList FooValues { get; set; }
public string FooValue { get; set; }

и затем в моем коде для построения модели представления я делаю:

viewModel.FooValues = new SelectList(FooCollection, "FooId", "FooText", viewModel.FooValue);

Тогда, на мой взгляд:

@Html.DropDownListFor(m => m.FooValue, Model.FooValues)

Надеюсь, это поможет.

...