列表框中的所选项目为空,我该如何解决?

The selected item in a listbox is null how can i fix that?

我正在开发一个列表框系统,该系统允许使用我的控制器中的删除方法删除制度中的练习。当前,当我 select 一个项目然后单击删除它时 returns 一个空的项目列表并且没有对数据库进行任何更改

目前我的代码没有产生任何错误,但是目前在设置一些断点后,RemoveExercises 中的 item 当前似乎为空。所以我将行 RegimeItem item = model.RequestedExercises.FirstOrDefault(i => i.RegimeItemID == selected); 更改为 RegimeItem item = model.RequestedSelected... 现在我收到错误 'int' does not contain a definition for 'RegimeItemID' and no extension method 'RegimeItemID' accepting a first argument of type 'int' could be found

我想要发生的是 selected 的制度项目在按下删除按钮时被删除。

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>

您的问题源于您试图获取 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);
    }
}