ASP MVC 2:POST下拉列表出错

时间:2010-05-02 18:42:43

标签: c# asp.net asp.net-mvc post drop-down-menu

好吧我是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>'.

此错误会在我的视图中的行中显示,其中显示下拉列表。

我真的不知道如何解决这个问题并尝试了我在网上找到的几种解决方案。但它们都没有真正奏效。

提前Ty!

2 个答案:

答案 0 :(得分:2)

我见过这样的错误。 这是因为渲染视图时ViewData["days"] as SelectList为null。这可能是因为ViewData [“days”]为null或者与SelectList不同。 问题必须在这里找到:

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

让shure,这个代码

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

在返回View之前运行并且ViewData [“days”]不为null且IEnumerable。它必须是Model.IsValid,因此ViewData [“days”]没有绑定。

答案 1 :(得分:0)

HttpPost控制器操作在看到“EventRegistreerViewModel model”时会调用模型构造函数。

[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--")

这种方式每次构建视图模型时都会包含选择列表