4
模型綁定列表框

我的模型是在MVC3

public class SiteConfig 
{ 
    public SiteConfig() 
    { 

    } 

    public int IdSiteConfig { get; set; } 
    public string Name { get; set; } 
    public byte[] SiteLogo { get; set; } 
    public string Brands { get; set; } 
    public string LinkColour { get; set; } 

    public IEnumerable<SiteBrand> SiteBrands { get; set; } 
} 

public class SiteBrand 
{ 
    public int Id { get; set; } 
    public int SiteId { get; set; } 
    public int BrandId { get; set; } 

    public Brand Brand { get; set; } 
    public SiteConfig SiteConfig { get; set; } 
} 

public class Brand 
{ 
    public int BrandId { get; set; } 
    public string Name { get; set; } 

    public IEnumerable<SiteBrand> SiteBrands { get; set; } 
} 

我下面數據庫第一種方法。每個SiteConfig記錄可以包含一個或多個品牌。所以品牌保存到另一個名爲SiteBrand的表。

SiteBrand包含對SiteConfig(IdSiteConfig)和品牌(BrandId)的外鍵引用。

當我創建一個SiteConfig時,我想顯示所有可用品牌作爲列表框,用戶可以選擇一個或多個記錄(可能不選擇任何品牌)。

但是,當我將我的視圖與模型綁定時,如何將我的列表框綁定到品牌列表,以及何時發佈視圖,如何獲取所選品牌。

我必須將SiteConfig對象保存到所選項目的數據庫中。這是我的DB圖。

這是我保存到數據庫的DAL。

public SiteConfig Add(SiteConfig item) 
    { 
     var siteConfig = new Entities.SiteConfig 
      { 
       Name = item.Name, 
       LinkColour = item.LinkColour, 
       SiteBrands = (from config in item.SiteBrands 
           select new SiteBrand {BrandId = config.BrandId, SiteId = config.SiteId}). 
        ToList() 
      }; 
     _dbContext.SiteConfigs.Add(siteConfig); 
     _dbContext.SaveChanges(); 
     return item; 
    } 

DB Schema

有人可以advide如何綁定列表框,並獲得選擇的項目。

謝謝。

回答

12

將一個新屬性添加到類型爲字符串數組的SiteConfig ViewModel。當用戶發佈此表單時,我們將使用這個來獲取Listbox中的Selected項。

public class SiteConfig 
{ 
    //Other properties here 
    public string[] SelectedBrands { get; set; } // new proeprty 
    public IEnumerable<SiteBrand> SiteBrands { get; set; } 
} 

在您的GET操作方法,獲得的SiteBrands列表,並分配給SiteConfig視圖模型對象

public ActionResult CreateSiteConfig() 
{ 
    var vm = new SiteConfig(); 
    vm.SiteBrands = GetSiteBrands(); 
    return View(vm); 
} 

爲了演示的SiteBrands財產,我只是硬編碼的方法。當你實現這個時,你可能會從數據訪問層得到數據。

在你看來,這是強類型到 SiteConfig視圖模型
public IList<SiteBrand> GetSiteBrands() 
{ 
    List<SiteBrand> brands = new List<SiteBrand>(); 
    brands.Add(new SiteBrand { Brand = new Brand { BrandId = 3, Name = "Nike" } }); 
    brands.Add(new SiteBrand { Brand = new Brand { BrandId = 4, Name = "Reebok" } }); 
    brands.Add(new SiteBrand { Brand = new Brand { BrandId = 5, Name = "Addidas" } }); 
    brands.Add(new SiteBrand { Brand = new Brand { BrandId = 6, Name = "LG" } }); 
    return brands; 
} 

現在,

@model SiteConfig 
<h2>Create Site Config</h2> 
@using (Html.BeginForm()) 
{ 
    @Html.ListBoxFor(s => s.SelectedBrands, 
       new SelectList(Model.SiteBrands, "Brand.BrandId", "Brand.Name")) 
    <input type="submit" value="Create" /> 
} 

現在,當用戶帖子這種形式,您將在視圖模型

SelectedBrands屬性來獲取選定的項目值
[HttpPost] 
public ActionResult CreateSiteConfig(SiteConfig model) 
{ 
    if (ModelState.IsValid) 
    { 
     string[] items = model.SelectedBrands; 
     //check items now 
     //do your further things and follow PRG pattern as needed 
    } 
    model.SiteBrands = GetBrands(); 
    return View(model); 
} 

enter image description here

+0

感謝日回覆。當我在模型中提交表單時,我得到選定的ID。但是我將SiteBrands設置爲null。如果我必須保存模型,這裏是否需要使用選定的項目創建SiteBrands集合並提交?或者還有其他更好的方法嗎? – Naresh 2012-08-13 15:08:36

+0

爲什麼在創建Siteconfig時需要SiteBrands集合?我想你需要從列表框中選擇的項目(這是你在最初的問題中提出的)。但是如果你再次渲染相同的視圖,那麼在將視圖模型返回到視圖之前,需要重新分配SiteBrands,因爲HTTP是無狀態的 – Shyju 2012-08-13 15:12:59

+0

因爲我的Create方法需要一個SiteConfig類型的對象。我的db只知道SiteBrands。 Id不知道有關選定ID的任何信息。正如我在我的問題中解釋的,SiteBrand包含對網站ID以及品牌ID的外鍵引用。 – Naresh 2012-08-13 15:20:33

0

您可以擁有一個「ViewModel」,其中包含網站和品牌模型。然後,您可以將您的視圖綁定到該模型。這將允許您將視圖的任何部分綁定到任何基礎模型的任何部分。

public class siteViewModel{ 
    public SiteConfig x; 
    public Brand b; //Fill this with all the available brands 
} 

當然你也可以包括任何其他信息,你的觀點可能需要(減少ViewBag,以及需要)。