[英]Dropdownlist asp.net
我有一個允許用戶創建新項目的應用程序。 現在,用戶需要填寫標題,正文和類別。
該類別是一個文本框,但我想將其轉換為下拉列表。 這些都連接到數據庫,並且當用戶提交數據庫時,數據應該保存在數據庫中。 現在一切正常,我在實現下拉列表方面遇到了麻煩。
我的模特:
public class NewsItem
{
public int ID { get; set; }
[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; }
}
最快/最好的方法是什么? 我應該在模型中執行此操作,還是可以分配視圖中可用的值?
提前致謝!
首先,一些語義。 由於Entity Framework是隨MVC一起提供的,因此假設您的POCO是“模型”。 (不幸的是,Microsoft通過將腳手架POCO放在“模型”文件夾中而積累了很多東西)。 但是,就Model-View-Controller中的“模型”而言,這些不是模型。 相反,它們僅是“實體”,這是一種說法,“ 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);
}
基本上,您只是在更新視圖模型,以便可以將其提供給視圖。 不過,您需要在實際返回之前填寫類別選擇。 我假設它們也是實體,但是您可以使用所需的任何方法在這里獲取它們,否則。
對於您的帖子操作:
[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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.