Asp.net-Mvc-3

Asp.Net MVC3 - 如何創建動態下拉列表

  • June 15, 2011

我找到了很多關於此的文章,但我仍然不知道該怎麼做。我正在嘗試創建自己的部落格引擎,我有創建文章的視圖(我首先使用 EF 和程式碼),現在我必須填寫應該添加文章的類別數,但我想將其更改為名稱為的下拉列表類別。我的模型看起來是這樣的:

public class Article
{
   public int ArticleID { get; set; }
   [Required]
   public string Title { get; set; }
   [Required]
   public int CategoryID { get; set; }
   public DateTime Date { get; set; }
   [Required()]
   [DataType(DataType.MultilineText)]
   [AllowHtml]
   public string Text { get; set; }
   public virtual Category Category { get; set; }
   public IEnumerable<SelectListItem> Categories { get; set; }
   public virtual ICollection<Comment> Comments { get; set; }
}
public class Category
{
   public int CategoryID { get; set; }
   [Required]
   public string Name { get; set; }
   public virtual ICollection<Article> Articles { get; set; }

}

我知道我必須使用 Enum(或者我認為),但我不確定如何使用。我不知道我發現的哪個教程最適合我。


編輯:

感謝您的回答,但我發現了別的東西。我正在嘗試這個:

這是我的模型:

public class Article
{
   [Key]
   public int ArticleID { get; set; }

   [Display(Name = "Title")]
   [StringLength(30, MinimumLength = 5)]
   [Required]
   public string Title { get; set; }

   public DateTime Date { get; set; }

   public int CategoryID { get; set; }

   [Required()]
   [DataType(DataType.MultilineText)]
   [AllowHtml]
   public string Text { get; set; }

  public Category Category { get; set; }

   public virtual ICollection<Comment> Comments { get; set; }

   public IEnumerable<Category> Categories { get; set; }
}
public class Category
{
[Key]
   public int CategoryId { get; set; }
   [Required]
public string CategoryName { get; set; }
   public virtual ICollection<Article> Articles { get; set; }

}

這是我創建文章的控制器:

public ActionResult Vytvorit()
{
   IEnumerable<Category> categories = GetCaregories();
   var view = View(new Article() { Categories = categories });
   view.TempData.Add("Action", "Create");

   return view;

}

private static IEnumerable<Category> GetCaregories()
{
   IEnumerable<Category> categories;
   using (BlogDBContext context = new BlogDBContext())
   {
       categories = (from one in context.Categories
                     orderby one.CategoryName
                     select one).ToList();
   }
   return categories;
}

private Category GetCategory(int categoryID)
{
       return db.Categories.Find(categoryID);
}
//
// POST: /Clanky/Vytvorit

[HttpPost]
public ActionResult Vytvorit(Article newArticle)
{

   try
   {
       if (newArticle.CategoryID > 0)
       {
           newArticle.Category = GetCategory(newArticle.CategoryID);
       }
       if (TryValidateModel(newArticle))
       {
               db.Articles.Add(newArticle);
               db.SaveChanges();
           return RedirectToAction("Index");
       }
       else
       {
           newArticle.Categories = GetCaregories();
           var view = View(newArticle);
           view.TempData.Add("Action", "Create");
           return view;
       }
   }
   catch
   {
       return View();

   }
}

這是我觀點的一部分:

    @Html.DropDownListFor(model => model.CategoryID, new SelectList(Model.Categories,"CategoryID","CategoryName"))
       @Html.ValidationMessageFor(model => model.CategoryID)

我對 NullReferenceExeption 有疑問,但我不知道為什麼。我可以這樣做嗎?對我來說這看起來很容易。

你的模型看起來很奇怪。它包含諸如CategoryID和之類的屬性,這些屬性Category似乎是多餘的。它還包含一個SelectListItem名為 的集合屬性Categories。那麼,這是模型還是視圖模型?看起來很亂。讓我們假設它是一個模型。在這種情況下,它更可能看起來像這樣:

public class Article
{
   public int ArticleID { get; set; }

   [Required]
   public string Title { get; set; }

   public DateTime Date { get; set; }

   [Required()]
   [DataType(DataType.MultilineText)]
   [AllowHtml]
   public string Text { get; set; }

   public virtual Category Category { get; set; }

   public IEnumerable<Category> Categories { get; set; }

   public virtual ICollection<Comment> Comments { get; set; }
}

public class Category
{
   public int CategoryID { get; set; }

   [Required]
   public string Name { get; set; }

   public virtual ICollection<Article> Articles { get; set; }

}

現在模型很清楚了,我們可以定義一個視圖模型,它將傳遞給視圖。視圖模型是專門為視圖設計的類。因此,根據您打算在此視圖中放置的內容,您可以在此視圖模型中定義它。到目前為止,您只討論了下拉,所以讓我們開始吧:

public class ArticleViewModel
{
   public int SelectedCategoryId { get; set; }
   public IEnumerable<SelectListItem> Categories { get; set; }
}

然後我們有一個控制器:

public class ArticlesController: Controller
{
   private readonly IArticlesRepository _repository;
   public ArticlesController(IArticlesRepository repository)
   {
       _repository = repository;
   }

   public ActionResult Index()
   {
       Article article = _repository.GetArticle();
       ArticleViewModel viewModel = Mapper.Map<Article, ArticleViewModel>(article);
       return View(viewModel);
   }
}

因此控制器使用儲存庫來獲取模型,將其映射到視圖模型(在本範例中我使用AutoMapper)並將視圖模型傳遞給將負責顯示它的視圖:

@model AppName.Models.ArticleViewModel
@using (Html.BeginForm())
{
   @Html.DropDownListFor(
       x => x.SelectedCategoryId, 
       new SelectList(Model.Categories, "Value", "Text"),
       "-- Select category --"
   )
   <input type="submit" value="OK" />
}

引用自:https://stackoverflow.com/questions/5049485