Создание выпадающего списка в MVC3 - PullRequest
0 голосов
/ 18 сентября 2011

Я пытаюсь создать выпадающий список для отображения всех значений в пользовательском классе коллекции такие как

public class MyCustomClassCollection
{

public List<MyCustomClass> {get;set;}

}

Я хочу, чтобы он отображал строку Description: каждого MyCustomClass

Я пытался

<%: Html.DropDownList "Description", MyCustomClass %>

Решарпер предлагает мне привести MyCustomClass к IEnemerable

, но сервер возвращает ошибку, связанную с приведением.

Есть идеи, как мне создать этот DropDownList?

__ Модификация _ __

public class ViewModel
    {
        public Detail detail { get; set; }
    }

public class Detail   //Inherited from webservce
{
   public CustomClassCollection {get;set;}
   .... Other Properties, a.k.a Custom Classes
}


public class CustomClassCollection
{
   public List<CustomClass> {get;set;}
}

public class CustomClass {
  public int Id {get;set;}
  public string Description{get;set;}
  ... other properties

}


public ActionResult Index(int? id, DateTime? date)
        {
            if (id.Equals(null))
                id = ######### ;
            if (date.Equals(null))
                date = DateTime.Today;
            var vm = new ViewModel
                         {
                             Detail = _repository.Detail((int)id,(DateTime)date)
                         };
            return View(vm);
        }

1 Ответ

3 голосов
/ 18 сентября 2011

Второй аргумент помощника DropDownList должен быть IEnumerable<SelectListItem> или SelectList, который реализует этот интерфейс в этом отношении.Таким образом, в вашем контроллере действия организуются таким образом, что вы преобразуете свою собственную коллекцию в IEnumerable<SelectListItem>.Как всегда, вы можете начать с написания модели представления:

public class MyViewModel
{
    public string SelectedDescription { get; set; }
    public SelectList Descriptions { get; set; }
}

, а затем попросить действия вашего контроллера запросить пользовательский список и заполнить модель представления, которая будет передана в представление:

public ActionResult Index()
{
    var descriptions = yourCustomCollection.MyCustomClass.Select(x => new
    {
        Value = x.Description,
        Text = x.Description
    });
    var model = new MyViewModel
    {
        Descriptions = new SelectList(descriptions, "Value", "Text")
    };
    return View(model);
}

и, наконец, в вашем строго типизированном виде:

<%= Html.DropDownListFor(x => x.SelectedDescription, Model.Decriptions) %>

ОБНОВЛЕНИЕ:

После публикации обновленных моделей (которые, кстати, все еще не завершены и их невозможно скомпилировать, как у вас есть)не предоставил никаких имен свойств), вот пример:

public class ViewModel
{
    public int SelectedId { get; set; }
    public Detail Detail { get; set; }
}

public class Detail
{
   public CustomClassCollection MyCollection { get; set; }
}


public class CustomClassCollection
{
   public List<CustomClass> CustomClass { get; set; }
}

public class CustomClass 
{
    public int Id { get; set; }
    public string Description { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var vm = new ViewModel
        {
            Detail = new Detail
            {
                MyCollection = new CustomClassCollection
                {
                    CustomClass = new List<CustomClass>
                    {
                        new CustomClass
                        {
                            Id = 1,
                            Description = "description 1",
                        },
                        new CustomClass
                        {
                            Id = 2,
                            Description = "description 2",
                        },
                        new CustomClass
                        {
                            Id = 3,
                            Description = "description 3",
                        },
                    }
                }
            }
        };
        return View(vm);
    }
}

и в представлении:

<%= Html.DropDownListFor(
    x => x.SelectedId, 
    new SelectList(Model.Detail.MyCollection.CustomClass, "Id", "Description")
) %>

Что вы должны понимать, чтобы определить раскрывающийся список в ASP.NET MVC, если вам нужно 2 вещи:

  1. Скалярное свойство для привязки выбранного значения к (SelectedId в моем примере)
  2. Коллекция для привязки списка к (Model.Detail.MyCollection.CustomClass в примере)
...