0

カテゴリ付きの投稿を追加したいのですが、私のAddアクションBlogControllerは次のようになります:

private readonly IBlogPostRepository _blogPostRepository;
private readonly ICategoryRepository _categoryRepository;

public BlogController()
        {
            _blogPostRepository = new BlogPostRepository(new SiteContext());
            _categoryRepository = new CategoryRepository(new SiteContext());
        }


        public BlogController(IBlogPostRepository blogPostRepository, ICategoryRepository      categoryRepository)
        {
            _blogPostRepository = blogPostRepository;
            _categoryRepository = categoryRepository;
        }

        public ActionResult Add()
        {
            ViewData["categoryList"] = _categoryRepository.GetAllCategory();
            return View("Add");
        }

        [HttpPost]
        public ActionResult Add(BlogPost blogPost)
        {
            if (ModelState.IsValid)
            {
                blogPost.PublishDate = DateTime.Now;

                _blogPostRepository.AddPost(blogPost);
                _blogPostRepository.Save();
                return RedirectToAction("Add");
            }
            return new HttpNotFoundResult("An Error Accoured while requesting your order!");
        }

私の最初の質問は、なぜカテゴリリストをSelectListかみそりでキャストしてカテゴリを選択できないのDropDownListですか?ビューにある私のコードは次のようになります。

    <div>
        @Html.LabelFor(b => b.Category)
        @Html.DropDownList("Category", ViewData["categoryList"] as SelectList)
        @Html.ValidationMessageFor(b => b.Category)
    </div>

私の2番目の質問は、リクエストに応じてカテゴリを追加するにはどうすればよいAddですPOSTか?

4

1 に答える 1

0

ドロップダウンにコレクションを使用するには、タイプIEnumerable<SelectListItem>がである必要SelectListがあります。オブジェクトの任意のコレクションを取得して、それをにキャストすることはできませんSelectList

を作成するために拡張メソッドを使用するのが好きです、IEnumerable<SelectListItem>これをチェックしてください:

public static class SelectListExtensions
{
    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> source)
    {
        return ToSelectList(source, null);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> source, string defaultOption)
    {
        return ToSelectList(source, value => value, value => value.ToString(), null);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T, TDataValue>(
        this IEnumerable<T> source,
        Func<T, TDataValue> dataValueSelector,
        Func<T, string> dataTextSelector)
    {
        return ToSelectList(source, (value, index) => dataValueSelector(value), dataTextSelector, null);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T, TDataValue>(
        this IEnumerable<T> source,
        Func<T, int, TDataValue> dataValueSelector,
        Func<T, string> dataTextSelector)
    {
        return ToSelectList(source, dataValueSelector, dataTextSelector, null);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T, TDataValue>(
        this IEnumerable<T> source,
        Func<T, TDataValue> dataValueSelector,
        Func<T, string> dataTextSelector,
        string defaultOption)
    {
        return ToSelectList(source, (value, index) => dataValueSelector(value), dataTextSelector, defaultOption);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T, TDataValue>(
        this IEnumerable<T> source,
        Func<T, int, TDataValue> dataValueSelector,
        Func<T, string> dataTextSelector,
        string defaultOption)
    {
        var list = source.Select((item, index) => new SelectListItem
        {
            Value = dataValueSelector(item, index).ToString(),
            Text = dataTextSelector(item),
        }).ToList();

        if (defaultOption == null) return list;

        list.Insert(0, new SelectListItem { Text = defaultOption, Value = "-1" });

        return list;
    }
}

その後、コントローラーでこの拡張メソッドを使用できます。

public ActionResult Add()
{
    ViewData["categoryList"] = _categoryRepository.GetAllCategory()
        .ToSelectList(c => c.Id, c => c.Name);

    return View("Add");
}

CategoryあなたがプロパティIdを持っていると仮定してName...

そして、それをあなたの見解で使用してください:

@Html.DropDownList("Category", ViewData["categoryList"] as IEnumerable<SelectListItem>)

ViewDataちなみに、 /を使用するのではなく、モデルを使用して(強く型付けされた)ビューに渡すことをお勧めしますViewBag。それはあなたが何かをリファクタリングしようとしている日にあなたに多くのトラブルを救い、そしてそれはまたあなたに良いツールの助け(インテリセンス)を与えます。

于 2013-02-10T21:47:39.887 に答える