ASP MVC 2: ошибка с выпадающим списком на POST - PullRequest
2 голосов
/ 02 мая 2010

Хорошо, я новичок в asp mvc2, и у меня возникли некоторые проблемы с htmlhelper с именем Html.dropdownlistfor ();

Я хочу представить пользователю список дней недели. И я хочу, чтобы выбранный элемент был привязан к моей модели.

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

public static class days
{
    public static List<Day> getDayList()
    {
        List<Day> daylist = new List<Day>();

        daylist.Add(new Day("Monday", "MO"));
        daylist.Add(new Day("Tuesday", "TU"));
        // I left the other days out
        return daylist;
    }

    public class Dag{
        public string DayName{ get; set; }
        public string DayShortName { get; set; }

        public Dag(string name, string shortname)
        {
            this.DayName= name;
            this.DayShortName = shortname;
        }
    }
}

У меня действительно есть идея, если это правильный способ сделать это

Затем я вставил это в свой контроллер:

SelectList _list = new SelectList(Days.getDayList(), "DayShortName", "DayName");
        ViewData["days"] = _list;
        return View("");

У меня есть эта строка в моей модели

public string ChosenDay { get; set; }

И это, на мой взгляд, для отображения списка:

<div class="editor-field">
            <%: Html.DropDownListFor(model => model.ChosenDay, ViewData["days"] as SelectList, "--choose Day--")%>
        </div>

Теперь все это прекрасно работает. При первом посещении, но потом, когда я делаю [HttpPost] Который выглядит следующим образом:

[HttpPost]
    public ActionResult Registreer(EventRegistreerViewModel model)
    {
       // I removed some unrelated code here 

       // The code below executes when modelstate.isvalid == false
        SelectList _list = new SelectList(Days.getDayList(), "DayShortName", "DayName");
        ViewData["days"] = _list;
        return View(model);
    }

Тогда мне будет выдано следующее исключение:

The ViewData item that has the key 'ChosenDay' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>'.

Это сообщение об ошибке выдается в строке, в которой я отображаю раскрывающийся список.

Я действительно понятия не имею, как решить эту проблему, и попробовал несколько решений, которые я нашел в Интернете. но никто из них действительно не работал.

Ты заранее!

Ответы [ 2 ]

2 голосов
/ 03 мая 2010

Я видел такую ​​ошибку. Это потому, что ViewData["days"] as SelectList является нулевым, когда представление отображается. Это может быть потому, что ViewData ["days"] имеет значение null или имеет другой тип, чем SelectList. Проблема должна быть найдена здесь:

[HttpPost]
public ActionResult Registreer(EventRegistreerViewModel model)
{
}

Убедитесь, что этот код

SelectList _list = new SelectList(Days.getDayList(), "DayShortName", "DayName");
 ViewData["days"] = _list;

запускается, и что ViewData ["days"] не равен NULL и IEnumerable перед возвратом View Это должно быть из-за Model.IsValid, чтобы ViewData ["days"] не был связан.

0 голосов
/ 28 августа 2012

Действие контроллера HttpPost вызовет конструктор модели, когда увидит «Модель EventRegistreerViewModel».

[HttpPost] 
public ActionResult Registreer(EventRegistreerViewModel model) 

Так что, если вы добавите код в модель EventRegistreerViewModel, например:

...
public IEnumerable<string> MySelectList { get; set; }
public EventRegistreerViewModel() {
    // build the select the list as selectList, then
    this.MySelectList = selectList;
}

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

Html.DropDownListFor(model => model.ChosenDay, model.MySelectList, "--choose Day--")

Таким образом, каждый раз при построении модели представления будет включаться список выбора

...