1

在我的控制器中,我有:

        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如何解决这个问题?

4

5 回答 5

3

你也许可以试试

ViewData["categories"] = new SelectList(categories, "Id", "Name");

(假设 Category 有一个 Name 和 Id 字段)

然后您可以添加逻辑以保留所选值。

编辑:如果我没记错的话,导致您的错误消息不完整:它要求提供IEnumerable<SelectListItem>

于 2012-04-08T17:25:49.693 回答
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>

希望这会帮助你。谢谢。

于 2012-04-08T22:19:42.807 回答
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 -->
}

您的 Create 操作方法:

public ActionResult Create()
{
     ProductCreateViewModel viewModel = new ProductCreateViewModel
     {
          // Here you do a database call to populate your dropdown
          Categories = categoryService.GetAllCategories()
     };

     return View(viewModel);
}

我希望这有帮助。

于 2012-04-08T18:24:45.437 回答
0

在创建ViewData项目之前的行中,您可以List<T>IEnumerable<T>

IEnumerable<Category> cat = categories;
ViewData["categories"] = cat;
于 2012-04-08T17:31:01.430 回答
0

我知道这很旧,但万一有人正在寻找答案

假设Category有和Id,并且Name和当前CategoryId在模型中

@Html.DropDownListFor(m => m.CategoryId, new SelectList((IEnumerable)ViewData["categories"], "Id", "Name"))
于 2016-03-08T02:34:07.210 回答