mvc3视图viewdata和viewbag为null

时间:2012-12-09 19:22:06

标签: c# asp.net-mvc asp.net-mvc-3 visual-studio-2010

我似乎无法通过ViewBag或ViewData将任何数据传递给View。它只是一直无效。

ViewResult代码:

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

        ViewData["Categories"] = _repository.Categories;
        ViewData["CategoryList"] = _repository.Categories.Select(x => new SelectListItem { Text = x.Name, Value = x.ID.ToString(), Selected = product.ID == x.ID });
        ViewBag.Test = "Hello";

        return View(product);
    }

这是剃刀代码:

@model NightingalecrossMVC.Domain.Entities.Product
@{
    var test = ViewData.Eval("CategoryList");

    var test2 = ViewBag.Test;

    ViewBag.Title = "Edit Treatment";

    AjaxOptions ajaxOpts = new AjaxOptions
    {
        UpdateTargetId = "saveData",
        HttpMethod = "Post",
        LoadingElementId = "loader"
    };
}

为什么会这样?它适用于任何其他视图?!

1 个答案:

答案 0 :(得分:0)

获取空值的原因是因为我有这个:

    public ViewResult CreateProduct()
    {
        return View("EditProduct", new Product());
    }

需要这样:

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

修改

实际上,由于LINQ中的ToString()方法,你不能创建像这样的selectlistitem列表,它需要用{}而不是新的SelectListItem来拉长,以便从中创建一个正确的函数。但这会降低可读性。所以最好的解决方案是创建一个返回IEnumerable的函数,然后你可以创建一个SelectList。

关于使用SelectList存在一些争议,DropDownList不支持该重载。但是,SelectList确实实现了IEnumerable,因此不应该支持SelectList。