2014-03-03 213 views
0

我有一個允許用戶創建新項目的應用程序。現在,用戶需要填寫標題,正文和類別。Dropdownlist asp.net

該類別是一個文本框,但我想將其轉換爲下拉列表。這全部連接到數據庫,當用戶提交數據時,數據應該保存在數據庫中。現在一切正常,我只在實現dropdownlist時遇到困難。

我的模型:

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; } 
    } 

什麼是執行此操作的最快/最好的方法。我應該在模型中進行還是可以在視圖中分配可用值?

在此先感謝!

+0

的http://計算器。com/questions/388483/how-do-you-create-a-dropdownlist-from-an-enum-in-asp-net-mvc –

回答

1

首先是一些語義。由於實體框架與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) 
+0

感謝這個詳細的答案:),非常通知..我有一個關於「定義「類別選擇。我還沒有使用IEnumerable列表,因爲我是新來的c#asp.net。假設我想要3種雞蛋,麪包和黃油。我可以在視圖中使用類似categorychoices.add(「bread」),categorieschoices.add(butter)等的東西,然後根據您的建議返回控制器中的每個類別? – user3265963

+0

「IEnumerable」只是一個*接口*枚舉(循環)在數據集上,'List'實現'IEnumerable'以及'IList'和其他接口。如果你不熟悉接口,那麼它們是使用C#的核心部分。一些偉大的課程或只是看看一個好的谷歌搜索可以出現。 –