2015-05-14 27 views
1

我正在使用列表框系統,該列表框系統允許使用我的控制器中的刪除方法刪除系統中的練習。目前,當我選擇一個項目,然後點擊刪除它返回一個空的列表項目,並沒有對數據庫進行任何更改列表框中的選定項目爲空我怎樣才能解決這個問題?

目前我的代碼沒有產生任何錯誤,但當前設置了一些斷點後,看起來itemRemoveExercises當前爲null。所以我改了行RegimeItem item = model.RequestedExercises.FirstOrDefault(i => i.RegimeItemID == selected);RegimeItem item = model.RequestedSelected...,現在我recieving錯誤'int' does not contain a definition for 'RegimeItemID' and no extension method 'RegimeItemID' accepting a first argument of type 'int' could be found

我希望發生的是選擇按下刪除按鈕時被刪除政權項目。

Controller.cs

[HttpGet] 
    public ActionResult ExerciseIndex(int id, UserExerciseViewModel vmodel) 
    { 

     //Session["UserExerciseViewModel"] = userExerciseViewModel; 
     User user = db.Users.Find(vmodel.UserID); 
     //User user = db.Users.Find(id); 
     //vmodel.UserID = user.UserID; 
     UserExerciseViewModel model = new UserExerciseViewModel { AvailableExercises = GetAllExercises(), RequestedExercises = ChosenExercises(user, vmodel) }; 
     Session["UserExerciseViewModel"] = model; 
     return View(model); 
    } 

    //Post 
    [HttpPost] 
    public ActionResult ExerciseIndex(UserExerciseViewModel model, string add, string remove, string send, int id, RegimeItem item) 
    { 
     // model = (UserExerciseViewModel)(Session["UserExerciseViewModel"]); 
     //model.UserID = user.UserID; 
     User user = db.Users.Find(model.UserID); 
     user.RegimeItems = model.RequestedExercises; 
     UserExerciseViewModel model2 = (UserExerciseViewModel)(Session["UserExerciseViewModel"]); 
     model.RequestedExercises = model2.RequestedExercises; 
     model.AvailableExercises = model2.AvailableExercises; 
     if (!string.IsNullOrEmpty(add)) 
      AddExercises(model, id); 
     else if (!string.IsNullOrEmpty(remove)) 
      RemoveExercises(model, id);    
     SaveState(model); 
     RestoreSavedState(model, user); 
     return View(model); 
    } 

    void SaveState(UserExerciseViewModel model) 
    { 
     model.SavedRequested = string.Join(",", model.RequestedExercises.Select(p => p.RegimeItemID.ToString()).ToArray()); 
     db.SaveChanges(); 
    } 

    void RemoveExercises(UserExerciseViewModel model, int id) 
    { 
     var userExerciseViewModel = (UserExerciseViewModel)(Session["UserExerciseViewModel"]); 
     foreach (int selected in model.RequestedSelected) 
     { 
      RegimeItem item = model.RequestedExercises.FirstOrDefault(i => i.RegimeItemID == selected); 
      if (item != null) 
      { 
       User user = db.Users.Find(id); 
       model.RequestedExercises.Remove(item); 
      } 
     } 
     db.SaveChanges(); 
    } 

    void AddExercises(UserExerciseViewModel model, int id) 
    { 
     var userExerciseViewModel = (UserExerciseViewModel)(Session["UserExerciseViewModel"]); 
     foreach (int selected in model.AvailableSelected) 
     { 
      if (model.AvailableSelected != null) 
      { 
       User user = db.Users.Find(id); 
       user.RegimeItems.Add(new RegimeItem() 
       { 
        RegimeExercise = (this.GetAllExercises().FirstOrDefault(i => i.ExerciseID == selected)) 
       }); 
      } 
     } 
     db.SaveChanges(); 
     //RedirectToAction("ExerciseIndex"); 
    } 

    void RestoreSavedState(UserExerciseViewModel model, User user) 
    { 
     user.RegimeItems = model.RequestedExercises; 
     //get the previously stored items 
     if (!string.IsNullOrEmpty(model.SavedRequested)) 
     { 
      string[] exIds = model.SavedRequested.Split(','); 
      var regimeItems = ChosenExercises(user, model).Where(p => exIds.Contains(p.RegimeItemID.ToString())); 
      model.RequestedExercises.AddRange(regimeItems); 
     } 
     db.SaveChanges(); 
    } 

    private List<Exercise> GetAllExercises() 
    { 
     return db.Exercises.ToList(); 
    } 

    private List<RegimeItem> ChosenExercises(User user, UserExerciseViewModel model) 
    { 
     return db.Users 
    .Where(u => u.UserID == user.UserID) 
    .SelectMany(u => u.RegimeItems) 
    .ToList(); 
    } 

模型(CS)

public class User 
    { 
     public int UserID { get; set; } 
     public ICollection<RegimeItem> RegimeItems { get; set; } 
     public User() 
     { 
      this.RegimeItems = new List<RegimeItem>(); 
     } 
    } 
    public class RegimeItem 
    { 
     public int RegimeItemID { get; set; } 
     public Exercise RegimeExercise { get; set; } 
    } 

ViewModel.cs

public class UserExerciseViewModel 
{ 
    public List<Exercise> AvailableExercises { get; set; } 
    public List<RegimeItem> RequestedExercises { get; set; } 
    public int? SelectedExercise { get; set; } 
    public int[] AvailableSelected { get; set; } 
    public int[] RequestedSelected { get; set; } 
    public string SavedRequested { get; set; } 
} 

View.cshtml(僅段)

 <input type="submit" name="remove" 
      id="remove" value="<<" /> 
    </td> 
    <td valign="top"> 
     @Html.ListBoxFor(model => model.RequestedSelected, new MultiSelectList(Model.RequestedExercises, "RegimeItemID", "RegimeExercise.Name", Model.RequestedSelected)) 
    </td> 

回答

1

你的問題的事實,你正在試圖將一個int值的RegimeItemID財產梗;看看下面的例子:

public int[] RequestedSelected { get; set; } 
RegimeItem item = model.RequestedSelected.FirstOrDefault(i => i.RegimeItemID == selected); 

基本上你告訴LINQ到嘗試使用int迭代器int[]陣列的.RegimeItemID

如果我沒有記錯的話你的結構,你應該改變

RegimeItem item = model.RequestedSelected.FirstOrDefault(i => i.RegimeItemID == selected); 

到:

RegimeItem item = model.RequestedExercises[selected]; 
在循環

foreach (int selected in model.RequestedSelected) 
//foreach (var item in new ArrayList(model.RequestedExercises.RegimeItemID)) 
{ 
    RegimeItem item = model.RequestedExercises[selected]; 
    if (item != null) 
    { 
     model.RequestedExercises.Remove(item); 
     db.SaveChanges(); 
    } 
} 

編輯:

新的信息提供:在問題的代碼是逸岸正確的代碼,但問題在於這看起來應該更多的線沿線的RestoreSavedState方法:

void RestoreSavedState(UserExerciseViewModel model, User user) 
{ 
    user.RegimeItems = model.RequestedExercises; 
    //get the previously stored items 
    if (!string.IsNullOrEmpty(model.SavedRequested)) 
    { 
     string[] exIds = model.SavedRequested.Split(','); 
     var regimeItems = ChosenExercises(user, model).Where(p => exIds.Contains(p.RegimeItemID.ToString())); 
     model.RequestedExercises.AddRange(regimeItems); 
    } 
} 
+0

但是,這給了我一個:mscorlib.dll中發生類型'System.ArgumentOutOfRangeException'的異常,但未在用戶代碼中處理 其他形成:指數超出範圍。必須是非負的,並且小於集合的大小。「# – Nilmag

+0

@Nilmag然後我誤解了你的設計。該循環中的「selected」究竟代表什麼?它是RequestedExercises的'RegimeItemID'去除?如果是這樣,那麼原始查詢應該已經完成​​了。 –

+0

是的,我只是在那裏做了一個斷點,而'item'爲null'selected'顯示了RegimeItemID,它應該是'RequestedExercises'的一部分。 RequestedExercises當前顯示計數爲0,並且'RequestedSelected'顯示{int [1]}。我希望有所幫助。 – Nilmag

相關問題