2014-10-30 129 views
4

我已經創建了一個使用實體框架代碼的MVC項目。我的模型只是一種收集信息的形式。MVC下拉列表與實體框架

public class Application 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string MiddleInitial { get; set; } 
    public string LastName { get; set; } 
    public int SSN { get; set; } 
    public DateTime DOB { get; set; } 
    public string Street { get; set; } 
    public string City { get; set; } 
    public string State {get; set; } 
    public string Zip { get; set; } 
    public int HomePhone { get; set; } 
    public int BusinessPhone { get; set; } 
    public int MobilePhone { get; set; } 

}

我的目標是創建一個下拉與所有的國家的名單,但我發現這個因爲我已經通過腳手架,可欣賞創建的數據庫是非常困難和控制器。有沒有簡單的方法來實現這一點,並將其與現有數據庫綁定?我已經搜索了幾乎整整一天,沒有運氣。對模型/控制器/視圖包含什麼內容的概述/解釋將非常棒!


更新:我已經創建了一個名爲「國家」屬性「ID」和「Statename的」新模式,並在數據庫中創建一些狀態。在創建操作方法在我的 「應用程序」 控制我有:

控制器

public ActionResult Create() 
    { 

     ApplicationDbContext db = new ApplicationDbContext(); 
     this.ViewData["Id"] = new SelectList(db.States.ToList(), "Id", "StateName"); 
     return View(); 
    } 

查看

@Html.DropDownList("Id") 

現在的問題是,我得到這個錯誤「沒有類型爲」IEnumerable「的ViewData項目具有」Id「鍵。」非常感謝您的幫助!

+0

什麼問題,如何從數據庫中提取數據,或顯示在用戶界面? – 2014-10-30 20:55:08

+0

嗯,我不確定如何去做。我目前有一個應用程序表(上面)。我需要在設計器中手動創建另一個名爲「States」的表嗎?之後,我需要知道如何提取數據,然後將其顯示在我現有的表單上。 – dc922 2014-10-30 20:59:29

+0

查看一些教程http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an- asp-net-mvc-application – 2014-10-30 21:02:48

回答

1

創建一個數據層,檢索你想要的清單。然後使用EF來獲取所有狀態。

//assuming you have a table of states.. 
var states = db.States(); 

states表應該是唯一的狀態列表。

var selectList = new List<SelectListItem>(); 
foreach(var thing in states){ 
    //if you got everything, thus the ID field for the value... 
    selectList.Add(new SelectListItem {Text =thing.State, Selected = false, Value = thing.ID); 
} 

請確保在您的Viewmodel類中,selectlist是一個公共屬性.....並且設置爲您在上面所做的操作。您還需要爲視圖選擇回發提供一個字符串。

StatesSelectList = selectList; 
public IEnumberable<SelectListItem> StatesSelectList {get;set;} 
public string SelectedState {get;set;} 

在您看來,這樣做:

@Html.DropDownListFor(p=>Model.SelectedState, Model.StatesSelectList) 
+0

當你創建第一個'Application'時會發生什麼? 'application.select(p => p.State)'是空的,你將永遠無法添加一個新的'Application'! – 2014-10-30 23:53:17

+0

我的答案的第一個說法是必須訪問數據層。如果應用程序列表中沒有任何內容,則取決於數據層來填充它。當然,操作系統正在使用數據庫嗎?否則,數據層必須確定提供第一組信息的方式。這是MVC中的一種常見模式(模型的初始化)......當控制器創建模型的實例並將其傳遞迴視圖時,它就會實現。 – 2014-10-31 13:36:40

+0

再次通過你的邏輯。提示:國家:)需要單獨的表:) – 2014-10-31 20:20:38

7

它很簡單。將IEnumerable<SelectListItem>屬性添加到您的模型中(這裏我建議您製作一個ViewModel,它可以具有與Application完全相同的屬性,下面的代碼作爲屬性包含在內)。然後你只需要建立名單,並將其發送到您的視圖

public IEnumerable<SelectListItem> States{ get; set; } 

我會假設你想從數據庫中檢索State值。這裏是你會怎麼做:

private IEnumerable<SelectListItem> GetAllStates() 
    { 
     var list = new Application(); 
     IEnumerable<SelectListItem> slItem = from s in db.Applications 
              select new SelectListItem 
              { 
               Selected = s.Id.ToString() == "Active", 
               Text = s.State, 
               Value = s.State.ToString() 
              }; 
     return slItem; 
    } 

然後做這樣的事情在你的行動:

var app = new Application 
     { 
      States = GetAllStates() 
     }; 

     return View(app); 

於是最後,請使用視圖剃刀顯示下拉列表這樣

@Html.DropDownListFor(m => m.State, Model.States, "--Select a State--") 

的第一個參數是模型更新的屬性,第二是數據的列表,第三是將要顯示的默認消息

希望這會有所幫助。

+0

很棒!謝謝 – 2018-01-02 20:32:04

0

非常簡單的代碼步步

1)在實體框架類

var productsList = (from product in dbContext.Products 
        select new ProductDTO 
        { 
         ProductId = product.ProductId, 
         ProductName = product.ProductName, 
         }).ToList(); 

2)在控制器

ViewBag.productsList = new EntityFrameWorkClass().GetBusinessSubCategoriesListForDD(); 

3)在View

@Html.DropDownList("Product_ProductId", new SelectList(ViewBag.productsList, "ProductId", "ProductName"), new { @class = "form-control" }) 

OR

@Html.DropDownListFor(m=>m.Product_ProductId, new SelectList(ViewBag.productsList , "ProductId", "ProductName"), new { @class = "form-control" }) 
0

我假設有一個具有Id和StateName屬性的States模型。

將列表更改爲ViewData [「State」]以確保在POST上輕鬆綁定。

Id是將在POST數據中發送的值,即.. State = Id。 StateName將顯示在選擇列表中。 因此對於你的模型來說這是不正確的,因爲State是一個字符串。所以必須

this.ViewData["State"] = new SelectList(db.States.ToList(), "StateName", "StateName"); 

然後在您的視圖

@Html.DropDownList("State")