2013-05-27 54 views
3

我繼承了我的第一個MVC項目,它涉及在Linq to SQL之上使用MVC3。我一直在試圖找到一種基於涉及交叉表的多對多關係來生成複選框列表的方法。使用複雜視圖模型和交叉表生成複選框列表

我有一個systemFailureType表通過交叉表映射到SystemFailureProblem表。

這裏是我的表設計佈局:

enter image description here

我在這裏的視圖模型

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using XNet.Repository.Model; 

namespace XNet.WebUI.Hotel.ViewModel 
{ 
    public class CheckFacilityVM 
    { 
     public int FacilityID { get; set; } 
     public string facilityName { get; set; } 
     public bool facilityAvailable { get; set; } 

     public virtual Facility facility { get; set; } 
     public virtual HotelFacility hotelfacility { get; set; } 
    } 
} 

這裏我控制器

public ActionResult Facility() 
     { 
      ViewBag.hotel = _hotelService.GetByID(1).HotelName; 

      var model = db.Facilities 
         .Select(htl => new CheckFacilityVM 
         { 
          FacilityID = htl.FacilityID, 
          facilityName = htl.FacilityName, 
          facilityAvailable = htl.IsActive, 
         }) 
         .ToList(); 

      return View(model); 
     } 

,在這裏我構造

public Facility ShowRoomFacility(int HotelID) 
     { 
      var x = (from d in db.Facilities 
        where d.FacilityID == HotelID 
        select d).FirstOrDefault(); 

      return x; 
     } 

我怎樣才能使這個.....

回答

2

我將提供你,你可以爲你的目的適應簡單的,更常見的例子 - 用戶和角色(用戶可以分配多個角色同樣角色可以有很多用戶)。

假設我們有一個「更新用戶」表單,我們想要設置用戶所屬的角色。

這裏的控制器/視圖模型會是什麼樣子:

public class UsersController : Controller { 

    [HttpGet] 
    public ActionResult Update(int id) { 
     var user = db.Users.Find(id); 
     var model = new UsersUpdateModel { 
      Name = user.Name, 
      SelectedRoles = user.Roles.Select(r => r.Id).ToList(), 
      Roles = GetRolesSelectList() 
     }; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Update(UsersUpdateModel model) { 
     var user = db.Users.Find(model.Id); 

     var roles = db.Roles.ToList(); 

     foreach (var role in roles) { 
      if (model.SelectedRoles.Contains(role.Id)) { 
       user.AddRole(role); 
      } 
      else { 
       user.RemoveRole(role); 
      } 
     } 
    } 

    public SelectList GetRolesSelectList() { 
     var roles = db.Roles.OrderBy(r => r.Name).ToList(); 
     return new SelectList(roles, "Id", "Name"); 
    } 
} 

public class UsersUpdateModel { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public IEnumerable<int> SelectedRoles { get; set; } 
    public SelectList Roles { get; set; } 
} 

從本質上講,你需要一個屬性添加到您的視圖模型持有可用角色(在這個例子中,「角色」)和一個保持選定的角色(在本例中爲「SelectedRoles」)。

在您的POST操作中,您可以加載所有角色,並且如果該ID存在於UsersUpdateModel.SelectedRoles中,則將該角色添加到該用戶,否則將其刪除。

我傾向於封裝在擁有關係的一側添加/刪除角色(或任何可能的集合)的過程 - 例如,User.AddRole可能會檢查角色是否已經存在以防止添加它兩次:

public void AddRole(Role role) { 
    var exists = this.Roles.FirstOrDefault(r => r.Id == role.Id); 

    if (exists == null) { 
     Roles.Add(role); 
    } 
} 

最後創建你可以使用我創建here助手複選框列表。它看起來像這樣:

@Html.CheckBoxListFor(model => model.SelectedRoles, Model.Roles) 

這應該給你足夠的繼續。請注意,該代碼是用記事本編寫的,因此可能不是複製/可粘貼的。