2013-02-10 26 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