我看过类似的帖子,但对我的案子没什么影响。 我有一个加载正常的表单,我看到所有类别的类别下拉列表。 问题是当我尝试发布表单时。
我收到此错误:
具有“类别”键的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);
}
答案 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 --
)
}