我怎样才能得到正确的信息显示在我的列表框中?

How can i get the correct information to display in my listbox?

我有两个列表框,您可以在其中将练习从可用练习列表移动到特定用户的选定练习列表。我当前的问题是我选择的列表(又名 RegimeItems)显示了所有用户的练习。

我认为问题出在 ChosenExercises(在控制器的底部)我也在:

处收到 空引用异常

var regimeIDs = model.SavedRequested.Split(',').Select(x => int.Parse(x));

Controller.cs

    [HttpGet]
            public ActionResult ExerciseIndex(int? id, UserExerciseViewModel vmodel)
            {
                User user = db.Users.Find(id);
                user.RegimeItems = ChosenExercises();
                UserExerciseViewModel model = new UserExerciseViewModel { AvailableExercises = GetAllExercises(), RequestedExercises = ChosenExercises(user, vmodel) };
                user.RegimeItems = model.RequestedExercises;
                return View(model);
            }

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

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

            void RestoreSavedState(UserExerciseViewModel model)
            {
                model.RequestedExercises = new List<RegimeItem>();

                //get the previously stored items
                if (!string.IsNullOrEmpty(model.SavedRequested))
                {
                    string[] exIds = model.SavedRequested.Split(',');
                    var exercises = GetAllExercises().Where(p => exIds.Contains(p.ExerciseID.ToString()));
                    model.AvailableExercises.AddRange(exercises);
                }
            }

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

            private List<RegimeItem> ChosenExercises(User user, UserExerciseViewModel model)//RegimeItem regimeItem)
            {
var regimeIDs = model.SavedRequested.Split(',').Select(x => int.Parse(x));
            return db.RegimeItems.Where(e => regimeIDs.Contains(e.RegimeItemID)).ToList();
            //return db.Users.Where(r => r.RegimeItems = user.UserID);
            //return db.Users.Where(r => r.RegimeItems.RegimeItemID == user.UserID);
            }

型号

  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

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; }
}

尝试更改

return db.Users.Where(r => r.RegimeItems = user.UserID);

return db.Users.Where(r => r.RegimeItems.RegimeItemID == user.UserID);

因为我读它的方式你目前正在尝试将一个 int 与一个对象匹配。

编辑:OP 自己发现了另一个错误。

"It seems that RegimeItems is a collection of RegimeItem - it does not have a have a single ID. So it needed to be .Where(u => u.UserID == user.UserID) and then to select the regimeItems associated with the user .SelectMany(u => u.RegimeItems).ToList(); Thanks for your help, if you update your answer with that i will mark yours as the correct answer."-尼尔马格

首先,您需要更新 ExcerciseIndex(int? id) 中对 ChosenExercises() 的调用,以像这样传入用户:ChosenExercises(user)

其次,转换错误是因为您正在将 r.RegimeItems 与 User ID 进行比较,它是一个 int。为了 return 用户的制度项目列表,您需要查询练习 table,而不是用户 table:

private List<RegimeItem> ChosenExercises(User user)//RegimeItem regimeItem)//User user, RegimeItem regimeItem)
{
  var regimeIDs = user.SavedRequested.Split(',').Select(x=>int.Parse(x));
  return db.RegimeItem.Where(e=> regimeIDs.Contains(e.RegimeItemID)).ToList();
}