尝试使用Dropdown列表发布MVC表单时出错

时间:2012-01-26 23:07:15

标签: asp.net-mvc-3

我看过类似的帖子,但对我的案子没什么影响。 我有一个加载正常的表单,我看到所有类别的类别下拉列表。 问题是当我尝试发布表单时。

我收到此错误:

具有“类别”键的ViewData项的类型为“System.String”,但必须是“IEnumerable”类型。

@ Html.DropDownList(“类别”,Model.Categories)< - 红色

以下是我的观点:

@using (Html.BeginForm("Save", "Album", FormMethod.Post, new { id = "frmNewAlbum" }))
{                
   @Html.DropDownList("Category", Model.Categories)
}

这是我的模特:

public class AlbumModel
{        
        public string Title { get; set; }

        public string Category { get; set; }

        public List<SelectListItem> Categories { get; set; } <-- holds categories
}

这是查看页面的控制器操作:

[HttpGet]
public ActionResult Save()
        {
            var model = new AlbumModel();
            var categories = new List<SelectListItem>() { new SelectListItem() { Text = "-- pick --" } };
            categories.AddRange(svc.GetAll().Select(x => new SelectListItem() { Text = x.Name, Value = x.Name }));
            model.Categories = categories;
            return View(model);
        }

收到帖子的行动:

[HttpPost]
    public ActionResult Save(AlbumModel model)
    {            
                var album = new AlbumDoc()
                {                        
                    Category = model.Category,
                    Title = model.Title,
                };

                svc.SaveAlbum(album);

        return View(model);
    }

1 个答案:

答案 0 :(得分:0)

在您的POST操作中,您似乎正在重新显示相同的视图,但您没有在视图模型上填充Categories属性,该属性将包含下拉列表值。顺便说一句,我建议你使用强类型助手。所以:

public class AlbumController: Controller
{
    [HttpGet]
    public ActionResult Save()
    {
        var model = new AlbumModel();
        model.Categories = GetCategories();
        return View(model);
    }

    [HttpPost]
    public ActionResult Save(AlbumModel model)
    {            
        var album = new AlbumDoc()
        {                        
            Category = model.Category,
            Title = model.Title,
        };
        svc.SaveAlbum(album);
        model.Categories = GetCategories();
        return View(model);
    }

    private IList<SelectListItem> GetCategories()
    {
        return svc
            .GetAll()
            .ToList()
            .Select(x => new SelectListItem
            { 
                Text = x.Name, 
                Value = x.Name 
            });
    }
}

并在您看来:

@model AlbumModel
...
@using (Html.BeginForm("Save", "Album", FormMethod.Post, new { id = "frmNewAlbum" }))
{                
   @Html.DropDownListFor(
       x => x.Category, 
       Model.Categories,
       -- pick --
   )
}