2013-02-10 52 views
0

我想補充了一條信息類,我在BlogControllerAdd動作是這樣的:填充下拉列表和添加新行,實體框架分貝

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> 

我的第二個問題是:我怎麼能在Add添加動作類與POST的要求嗎?

+0

您可以投射Viewdata。你這樣做是錯的。你使用C#或VB? – 2013-02-10 21:27:10

+0

添加類別的最佳方式是重新呈現下拉菜單。你可以使用其他方式像JQuery,但這是最乾淨的。 – 2013-02-10 21:28:35

+0

我正在使用C#,我該如何施放?我得到這個錯誤:沒有類型爲'IEnumerable '的ViewData項具有'Category'鍵。這是什麼 ?? – 2013-02-10 21:33:49

回答

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有屬性IdName ...

然後在您的視圖中使用它:

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

在一個側面說明,我會建議你使用模型來傳遞給你的(強類型)的意見,而不是使用ViewData/ViewBag。它可以爲您重構某些東西節省很多麻煩,同時也爲您提供了很好的工具幫助(intellisense)。

+0

謝謝克里斯蒂安!我剛剛檢查過它,它現在可以工作了,難道你沒有任何想法添加這個類別(當我選擇它的下拉列表)並將其分配給一個職位?我怎樣才能做到這一點 ?請 – 2013-02-10 22:03:30

+0

要獲得所選類別,您需要擁有一個將綁定到該值的模型,或者獲取該值(使用您的下拉列表的名稱)作爲操作方法參數。 – khellang 2013-02-10 22:44:22

+0

我對綁定類別和操作沒有任何問題,但主要問題是我無法爲blogpost創建類別! – 2013-02-10 22:47:08