在我的控制器中我有:
Category x = new Category(1, "one", 0);
Category y = new Category(2, "two", 1);
Category z = new Category(3, "three", 1);
List<Category> categories = new List<Category>();
categories.Add(x);
categories.Add(y);
categories.Add(z);
ViewData["categories"] = categories;
在我看来,我有:
<%= Html.DropDownList("categories")%>
但是我有一个错误:具有键'categories'的ViewData项的类型为'System.Collections.Generic.List`1 [[Category,MvcApplication1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'但必须是'IEnumerable'类型。
Uggggghhh怎么解决这个问题?
答案 0 :(得分:3)
您可以尝试
ViewData["categories"] = new SelectList(categories, "Id", "Name");
(假设Category有名称和Id字段)
然后你可以为keed选择的值添加逻辑。
编辑:导致您的错误消息未完成,如果我没错:它要求IEnumerable<SelectListItem>
答案 1 :(得分:0)
在创建ViewData
项目之前的行中,您可以将List<T>
转换为IEnumerable<T>
IEnumerable<Category> cat = categories;
ViewData["categories"] = cat;
答案 2 :(得分:0)
更好的方法是为每个视图/页面创建一个视图模型,用数据填充它(如果需要)并将其返回到视图/页面。切勿将您的域模型返回到视图/页面。
下面提供的代码适用于ASP.NET MVC3,但很容易与您的情况相关,请不要对我的答案进行投票:)
让我们假设您正在创建一个需要属于某个类别的新产品(显示在选择列表中),因此您需要一个创建视图/页面和操作方法。我将创建以下视图模型:
public class ProductCreateViewModel
{
// Include other properties if needed, these are just for demo purposes
public string Name { get; set; }
public string SKU { get; set; }
public string LongDescription { get; set; }
// This is the unique identifier of your category,
// i.e. foreign key in your product table
public int CategoryId { get; set; }
// This is a list of all your categories populated from your category table
public IEnumerable<Category> Categories { get; set; }
}
分类:
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
在您的“创建”视图中,您将拥有以下内容:
@model MyProject.ViewModels.ProductCreateViewModel
@using (Html.BeginForm())
{
<table>
<tr>
<td><b>Category:</b></td>
<td>
@Html.DropDownListFor(x => x.CategoryId,
new SelectList(Model.Categories, "Id", "Name", Model.CategoryId),
"-- Select --"
)
@Html.ValidationMessageFor(x => x.CategoryId)
</td>
</tr>
</table>
<!-- Add other HTML controls if required and your submit button -->
}
您的创建操作方法:
public ActionResult Create()
{
ProductCreateViewModel viewModel = new ProductCreateViewModel
{
// Here you do a database call to populate your dropdown
Categories = categoryService.GetAllCategories()
};
return View(viewModel);
}
我希望这会有所帮助。
答案 3 :(得分:0)
使用Jquery Ajax + JSON来填充下拉列表。这将导致更好的响应式网页。
这很简单。你所要做的就是,添加一个返回类型JSONResult的新动作,并将下拉加载代码移动到那里。
在控制器类中:
创建一个新动作:
public JsonResult FillDropDown()
{
Category x = new Category(1, "one", 0);
Category y = new Category(2, "two", 1);
Category z = new Category(3, "three", 1);
List<Category> categories = new List<Category>();
categories.Add(x);
categories.Add(y);
categories.Add(z);
return Json(categories,JsonRequestBehavior.AllowGet);
}
在视图页面中:从服务器添加加载数据的Jquery代码。
<script type="text/javascript">
$(document).ready(function ()
{
var _selbxTest = $('#selbxTest'); //Get dropdownlistbox
$.getJSON(
'@Url.Action("FillDropDown","Home")', //Provide JsonResultActionName, ControllerName
{},
function (_recdData) {
//Update dropdownListBox here
_selbxTest.append($('<option></option>').val(0).html('Select'));
$.each(_recdData, function (key, value) {
_selbxTest.append($('<option></option>').val(value.value).html(value.text));
});
});
});
</script>
最后在视图页面中添加一个简单的选择框,而不是Html.DropDownList()
<div>
<select id="selbxTest"></select>
</div>
希望这会对你有所帮助。感谢。
答案 4 :(得分:0)
我知道这已经过时了,以防万一有人在寻找答案
假设Categories有和Id,Name和当前的CategoryId在模型中
@Html.DropDownListFor(m => m.CategoryId, new SelectList((IEnumerable)ViewData["categories"], "Id", "Name"))