列表框中的所选项目为空,我该如何解决?
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);
}
}
我正在开发一个列表框系统,该系统允许使用我的控制器中的删除方法删除制度中的练习。当前,当我 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);
}
}