首先是一些語義。由於實體框架與MVC一起出現,假設您的POCO是「模型」。 (不幸的是,通過將腳手架的POCO放置在「Models」文件夾中,微軟可以實現這一點)。然而,這些模型在模型 - 視圖 - 控制器中的「模型」方面是而不是模型;相反,它們僅僅是「實體」,這是一種奇特的方式,說「幾乎只有DTO EF可以用來從數據庫填充數據。」
我指出:不,你不應該把你的下拉列表選項放在你的實體上。但是,你也不應該依賴這個觀點。你真正想要的是一個視圖模型。您可以創建一個僅包含需要編輯的字段以及視圖所需的任何其他業務邏輯(例如類別選擇)的類,然後將實體映射到該視圖模型和從該視圖模型映射出來。舉個例子:
public class NewsItemViewModel
{
[Required(ErrorMessage = "Title is Required")]
public string Title { get; set; }
[Required(ErrorMessage = "Body is Required")]
public DateTime DateCreate { get; set; }
public string Category { get; set; }
public IEnumerable<SelectListItem> CategoryChoices { get; set; }
}
注意的是,雖然這個類是大多一樣,它不包含Id
財產,因爲這不是你想要的用戶做一些修改。此外,它還包含一個CategoryChoices
屬性以容納您的下拉列表中的項目。
然後在你的控制器,你會做這樣的事情:
public ActionResult CreateNewsItem()
{
var model = new NewsItemViewModel();
model.CategoryChoices = db.Categories.Select(m => new SelectListItem { Value = m.Name, Text = m.Name });
return View(model);
}
基本上,你只是newing了視圖模型,以便您可以將其提供給視圖。但是,在實際返回之前填寫您的類別選擇。我假設他們也是實體,但是你可以使用任何你需要的方法在這裏獲取它們,否則。
爲您的文章操作:
[HttpPost]
public ActionResult CreateNewsItem(NewsItemViewModel model)
{
if (ModelState.IsValid)
{
// map view model to entity
var newsItem = new NewsItem
{
Title = model.Title,
Category = model.Category,
// and so on
}
db.NewsItems.Add(newsItem);
db.SaveChanges();
return RedirectToAction("Index");
}
model.CategoryChoices = db.Categories.Select(m => new SelectListItem { Value = m.Name, Text = m.Name });
return View(model);
}
我只是在做從視圖模型手動映射到一個新的新聞項目,在這裏,但對於真實世界的場景,你可能要整合一個爲此映射庫,如AutoMapper。另外,請注意,在出現錯誤的情況下,您必須重新填寫類別選項,然後再次返回視圖。這些不會被你的表單發佈,所以傳入的模型將不會擁有它們。
最後,在你看來:
@model Namespace.To.NewsItemViewModel
...
@Html.DropDownListFor(m => m.Category, Model.CategoryChoices)
的http://計算器。com/questions/388483/how-do-you-create-a-dropdownlist-from-an-enum-in-asp-net-mvc –