Проблемы с DropDownList в MVC - PullRequest
       18

Проблемы с DropDownList в MVC

0 голосов
/ 14 июня 2011
`//View <tr><td>Experience level</td><td><div class="editor-field">
                    <%: Html.DropDownListFor(model => model.ExperienceLevelID, (SelectList)ViewData["Experience"], "--select--")%>
                    <%: Html.ValidationMessageFor(model => model.ExperienceLevelID) %>
                </div></td></tr>`<tr><td>Size of Company</td><td><div class="editor-field">

                <%: Html.DropDownList("Value", (SelectList)ViewData["size"], "--select--")%>

 public ActionResult Create()//Controller
    {
        ViewBag.mode = "create";IExperienceLevelRepository expLevelResp = new ExperienceLevelRepository();
        IQueryable<ExperienceLevel> expLevel = expLevelResp.GetAllExperienceLevels().OrderBy(ExperienceLevel => ExperienceLevel.Name);
        ViewData["Experience"] = new SelectList(expLevel, "ID", "Name");


        IEnumerable<SelectListItem> companySizes = new List<SelectListItem>
                                             {

                                                 new SelectListItem
                                                     {
                                                       Text = "Large Company",
                                                          Value = "large"

                                                     }
                                             };
        ViewData["size"] = new SelectList(companySizes, "Value", "Text");



        return View();
    } 

Вышеприведенный выпадающий список отлично работает для ViewData ["Experience"], но он не работает с размером, мне приходится вручную указывать выпадающий список для размера, и выпадающий список опыта заполняется из db Ошибка, которую я получаю для выпадающего списка размера: нет элемента ViewData типа 'IEnumerable', который имеет ключ 'Value'.

Любая помощь или предложения будут высоко оценены.

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Я бы настоятельно рекомендовал вам использовать модели представлений и строго типизированные представления вместо ViewData и слабо типизированных помощников, поскольку у них отсутствует Intellisense и они являются источником многих ошибок и некрасивых представлений.

Модель:

public class MyViewModel
{
    [Required]
    public string SelectedExperienceId { get; set; }
    public IEnumerable<SelectListItem> Experiences { get; set; }

    [Required]
    public string SelectedSizeId { get; set; }
    public IEnumerable<SelectListItem> Sizes { get; set; }
}

Контроллер:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        Experiences = new[]
        {
            new SelectListItem { Value = "exp1", Text = "Experience 1" },
            new SelectListItem { Value = "exp2", Text = "Experience 2" },
            new SelectListItem { Value = "exp3", Text = "Experience 3" },
        },
        Sizes = new[]
        {
            new SelectListItem { Value = "s1", Text = "Size 1" },
            new SelectListItem { Value = "s2", Text = "Size 2" },
            new SelectListItem { Value = "s3", Text = "Size 3" },
        }
    };
    return View(model);
}

Строго типизированное представление:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master"     
    Inherits="System.Web.Mvc.ViewPage<AppName.Models.MyViewModel>" 
%>

...    

<%= Html.DropDownListFor(
    x => x.SelectedExperienceId,
    new SelectList(Model.Experiences, "Value, "Text"),
    "-- Experience --"
) %>
<%= Html.ValidationMessageFor(x => x.SelectedExperienceId) %>

...

<%= Html.DropDownListFor(
    x => x.SelectedSizeId,
    new SelectList(Model.Sizes, "Value, "Text"),
    "-- Size --"
) %>
<%= Html.ValidationMessageFor(x => x.SelectedSizeId) %>

Теперь все, что осталось, это заменить жестко закодированные значения значениями из вашей базы данных, сопоставив возвращенный набор результатов из репозитория в IEnumerable<SelectListItem>.

1 голос
/ 14 июня 2011

Это дает вам два разных способа добавления элементов в список SelectListItems.Вы можете связать с существующей коллекцией или заполнить ее вручную.

public List<SelectListItem> GetSomeSelectList()
{
  var items = SomeCollection
              .OrderByDescending(s => s.SomeProperty)
              .Select(s => new SelectListItem { 
                 Value = s.SomeProperty, 
                 Text = s.SomeOtherProperty })
              .ToList();
  items.Insert(0, new SelectListItem { Value = "0", Text = "Some Default" });
  return items;
}

Я согласен с Дарином, что вы должны использовать модели представления вместо представления данных.В моем случае я поместил вышеупомянутый метод в модель представления и, по моему мнению, я вызываю этот метод.

<%: Html.DropDownListFor(m => m.SomeProperty, Model.GetSomeSelectList()) %>
...