2015-02-07 71 views
0

我在這裏搜索了很多次,但我找不到我想要的。 我正在開發一個應用程序,讓用戶擁有特定的技能,並且我想將它們與特定項目聯繫起來。我的問題是:我在MVC4中使用CRUD,當我從UserDetail控制器打開編輯視圖時,爲了編輯用戶信息,我需要還可以添加(在相同的編輯視圖中)部分視圖或任何機制,其中列出了用戶的技能,使用複選框幫助爲該用戶多選擇各種技能,然後在按下「保存」時應該存儲用戶和UserSkill信息返回到dB(MS-SQL)。CheckBoxList在複雜的視圖

我使用此模型:

public class SkillsViewModel 
    { 
     public IList<Skill> AvailableSkills { get; set; } 
     public IList<Skill> SelectedSkills { get; set; } 
     public SavedSkills SevedSkills { get; set; } 
     public User Usr { get; set; } 
    } 

SavedSkills是UserSkills表,這將被用於分貝 AvailableSkills是技能表 SelectedSkills是被在編輯視圖中選擇的那些

牢記編輯視圖還包含一個圖像上傳文件:

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit(User Usr, HttpPostedFileBase file) 
     { 
      #region//validate file is selected 
      if (file != null) 
      { 
       if (file.ContentLength > (512 * 1000)) // 512 KB 
       { 
        ModelState.AddModelError("FileErrorMessage", "File size 
          must be within 512KB"); 
       } 
       string[] allowedType = new string  
          []"image/png", "image/gif", 
           "image/jpg", "image/jpeg" }; 
       bool isFileTypeValid = false; 
       foreach (var i in allowedType) 
       { 
        if (file.ContentType == i.ToString()) 
        { 
         isFileTypeValid = true; 
         break; 
        } 
       } 
       if (!isFileTypeValid) 
       { 
        ModelState.AddModelError 
         ("FileErrorMessage", "Only .png, 
          .gif and .jpg file allowed"); 
       } 
      } 
      #endregion 
      if (ModelState.IsValid) 
      { 
       if (Skk.Skk.Count (x => x.IsSelected) == 0) 
       { 
        //return "You have not selected any City"; 
       } 
       else 
       { 
        StringBuilder sb = new StringBuilder(); 
        sb.Append("You selected - "); 
        foreach (Skill skilll in Skk.Skk) 
        { 
         if (skilll.IsSelected) 
         { 
          sb.Append(skilll.SkillName + ", "); 
         } 
        } 
        //sb.Remove(sb.ToString().LastIndexOf(","), 1); 
        //return sb.ToString(); 
       } 


       //Update User 
       if (file != null) 
       { 
        string savePath = Server.MapPath("~/Pictures"); 
        string fileName = Guid.NewGuid() + Path.GetExtension 
          (file.FileName); 
        file.SaveAs(Path.Combine(savePath, fileName)); 
        Usr.ImagePath = fileName; 
       } 


       using (dBEntities dc = new dBEntities()) 
       { 
        var v = dc.Users.Where(a => a.Id.Equals 
          (Usr.Id)).FirstOrDefault(); 
        if (v != null) 
        { 
         v.UserName = Usr.UserName; 
         v.Email = Usr.Email ; 
         v.StartDate = Usr.StartDate ; 
         v.Company = Usr.Company ; 
         v.Position = Usr.Position; 
         v.Division = Usr.Division ; 
         v.Department = Usr.Department ; 
         v.PM = Usr.PM ; 
         v.AM = Usr.AM; 
         v.Permissions = Usr.Permissions; 
         v.IsActive = Usr.IsActive; 
         if (file != null) 
         { 
          v.ImagePath = Usr.ImagePath ; 
         } 
        } 
        dc.SaveChanges(); 
       } 
       return RedirectToAction("Index"); 
      } 
      ViewBag.Department = new SelectList 
        (db.Departments, "DepID", "DepName", Usr.Department); 
      ViewBag.Division = new SelectList 
        (db.Divisions, "DivID", "DivName", Usr.Division); 
      ViewBag.Position = new SelectList 
        (db.Positions, "PosID","PosName", Usr.Position); 
      return View(Usr); 
     } 

我希望我已經解釋清楚了,並且預先感謝你。

+0

您需要顯示視圖!您的視圖模型對於您描述的場景似乎是錯誤的。如果您想顯示/選擇用戶的技能,那麼您需要視圖模型來表示技能(例如ID,名稱,IsSelected)和視圖模型以編輯它們(用戶和List ) – 2015-02-07 23:43:45

回答

0

我和你的情況一樣。 我被用來選擇添加用戶的技能。恕我直言,它更加用戶友好,然後使用複選框(當你添加技能時,你可以選擇在鏈接進行的動作中),當你的數據庫中有超過20種技能時。 選擇是具有多個屬性但更漂亮的普通HTML「選擇」標籤。 我也使用Ajax JQuery將我的數據發佈到控制器。

JQuery POST方法還支持附加文件發送表單數據。 所以你不需要改變你的編輯動作。你需要的是爲選定的技能添加參數(這是一個用逗號分隔的字符串)。