如何在.NET MVC的多个视图中重用DropDownList

Pau*_*aul 15 c# asp.net-mvc asp.net-mvc-4

我项目中的几个视图都有相同的下拉列表...

所以,在该视图的ViewModel中,我有:

public IEnumerable<SelectListItem> FooDdl { get; set; }
Run Code Online (Sandbox Code Playgroud)

在控制器中我有:

var MyVM = new MyVM() {
    FooDdl = fooRepository.GetAll().ToSelectList(x => x.Id, x => x.Name)
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都那么好......但是我在每个具有该ddl的视图/控制器中执行相同的代码...

这是最好的方法吗?

谢谢

Vin*_*nyG 3

我们还使用静态类:

public static class SelectLists
{
        public static IList<SelectListItem> CompanyClasses(int? selected)
        {
            var session = DependencyResolver.Current.GetService<ISession>();

            var list = new List<SelectListItem>
                           {
                               new SelectListItem
                                   {
                                       Selected = !selected.HasValue,
                                       Text = String.Empty
                                   }
                           };

            list.AddRange(session.All<CompanyClass>()
                              .ToList()
                              .OrderBy(x => x.GetNameForCurrentCulture())
                              .Select(x => new SelectListItem
                                               {
                                                   Selected = x.Id == (selected.HasValue ? selected.Value : -1),
                                                   Text = x.GetNameForCurrentCulture(),
                                                   Value = x.Id.ToString()
                                               })
                              .ToList());

            return list;
        }
}
Run Code Online (Sandbox Code Playgroud)

在我们看来,没有什么特别的:

@Html.DropDownListFor(x => x, SelectLists.CompanyClasses(Model))
Run Code Online (Sandbox Code Playgroud)

有时我们还会创建一个 EditorTemplate,这样重用起来会更快

模型 :

[Required, UIHint("CompanyClassPicker")]
public int? ClassId { get; set; }
Run Code Online (Sandbox Code Playgroud)

编辑器模板:

@model int?

@if (ViewBag.ReadOnly != null && ViewBag.ReadOnly)
{
    var item = SelectLists.CompanyClasses(Model).FirstOrDefault(x => x.Selected);

    if (item != null)
    {
        <span>@item.Text</span>
    }
}
else
{
    @Html.DropDownListFor(x => x, SelectLists.CompanyClasses(Model))    
}
Run Code Online (Sandbox Code Playgroud)