簡體   English   中英

下拉列表asp.net

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM