1

我收到这个错误

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'CategoryList'.

我已经阅读了关于这个问题的所有其他关于 stackoverflow 的帖子,但我无法解决它!它应该可以工作,因为我创建了一个测试 mvc3 项目做完全相同的事情并且没有问题。

这是控制器代码:

    public ViewResult EditProduct(Guid id)
    {
        var product = _repository.Products.FirstOrDefault(x => x.ID == id);

        ViewBag.CategoryList = _repository.Categories.Select(x => new SelectListItem { Text = x.Name, Value = x.ID.ToString(), Selected = productToEdit.ID == x.ID }) as IEnumerable<SelectListItem>;

        return View(product);
    }

    [HttpPost]
    public ActionResult EditProduct(Product productToEdit)
    {
        ViewBag.CategoryList = _repository.Categories.Select(x => new SelectListItem { Text = x.Name, Value = x.ID.ToString(), Selected = productToEdit.ID == x.ID }) as IEnumerable<SelectListItem>;

        if (ModelState.IsValid)
        {
            _repository.SaveProduct(productToEdit);
            TempData["message"] = string.Format("{0} has been saved", productToEdit.Title);
            return RedirectToAction("Product");
        }          

        return View(productToEdit);
    }

这是剃须刀代码:

    <span class="field">
         @Html.DropDownList("CategoryList");
    </span>

我也试过:

    <span class="field">
         @Html.DropDownList("CategoryList", ViewBag.CategoryList as IEnumerable<SelectListItem>);
    </span>

附带说明一下,在<span>内部还有AjaxBeginForm对模型的其他调用。

我试过在 CategoryList 前面放一个 _0。那也不应该是个问题。我知道我什至不需要第二个参数类型来转换列表,因为我的测试项目不需要它。我知道我不必使用 ViewModel,因为这应该可以工作,MvcMusicStore 显示它可以工作。

为什么它对我不起作用?

感谢您的帮助,我将不胜感激示例代码,以使我更容易理解。

谢谢,

4

3 回答 3

0

使用视图模型:

public class ProductViewModel : ViewModelBase
{
    public IEnumerable<Product> Products { get; set; }
    public IEnumerable<SelectListItem> SelectItems { get; set; }
    public Guid SelectedItem { get; set; }
}

在 ActionResult 中使用它:

public ActionResult CreateProduct()
{
    var vm = new ProductViewModel()
        {
            SelectItems = _repository.Categories.AsEnumerable().Select(x => new SelectListItem { Text = x.Name, Value = x.ID.ToString() })
        };

    return View("Create", vm);
}
于 2013-04-25T09:39:21.130 回答
0

我已经走到这一步了。

我从一个调用 View EditProductViewResult CreateProduct()

所以我想我必须通过 ViewBag !我以为它会通过 EditProduct 初始化?!

代码:

    public ViewResult CreateProduct()
    {
        ViewBag.CategoryList = _repository.Categories.Select(x => new SelectListItem { Text = x.Name, Value = x.ID.ToString() });
        return View("EditProduct", new Product());
    }

我猜这行得通!

于 2012-12-09T19:56:33.577 回答
0

你可以使用.Html.DropDownListFor并且你必须通过 CategoryList 通过ViewData.try 以下:

<span class="field">
         @Html.DropDownListFor(e=>e.Category , (IEnumerable<SelectListItem>) ViewData["CategoryList"]);
</span>

在控制器中:

ViewData["CategoryList"] = _repository.Categories.Select(x =>
new SelectListItem { 
Text = x.Name, Value = x.ID.ToString(), Selected = productToEdit.ID == x.ID }) 
as IEnumerable<SelectListItem>;
于 2012-12-09T15:22:05.383 回答