0

ViewBag または ViewData を介してビューにデータを渡すことができないようです。nullで戻ってきます。

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"
    };
}

なぜこうなった?他のビューでも問題なく動作しますか?!

4

1 に答える 1

0

null 値を取得する理由は、これがあったためです。

    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 をサポートすべきではありません。

于 2012-12-09T20:01:41.463 に答える