Asp.net-Mvc-3
Asp.Net MVC3 - 如何創建動態下拉列表
我找到了很多關於此的文章,但我仍然不知道該怎麼做。我正在嘗試創建自己的部落格引擎,我有創建文章的視圖(我首先使用 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" /> }