[英]How to delete an item from this listbox?
I have a listbox where i need to be able to remove individual RegimeItems . 我有一个列表框,需要删除单个RegimeItems 。 These RegimItems belong to a specific user, but as they are right now the listbox shows them for specific user, so i don't know if i need to state that in the code.
这些RegimItems属于特定用户,但是由于它们现在是列表框,因此它们针对特定用户显示,因此我不知道是否需要在代码中说明。 Currently it is showing no error however it does not return the listbox with the remaining RegimeItems , nor does it actually update the database with the changes.
当前,它没有显示任何错误,但是它不会返回带有其余RegimeItems的列表框,也不会使用更改实际更新数据库。
Update : i am getting a null reference exception at model.RequestedSelected
on the line foreach (int selected in model.RequestedSelected)
in RemoveExercises. 更新 :我在RemoveExercises中的
foreach (int selected in model.RequestedSelected)
中foreach (int selected in model.RequestedSelected)
行上的model.RequestedSelected
处获得了空引用异常。
Controller 调节器
[HttpGet]
public ActionResult ExerciseIndex(int? id, UserExerciseViewModel vmodel)
{
User user = db.Users.Find(id);
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, RegimeItem regimeItem)
{
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 RemoveExercises(UserExerciseViewModel model, int id)
{
foreach (int selected in model.RequestedSelected)
{
RegimeItem item = model.RequestedExercises.FirstOrDefault(i => i.RegimeItemID == selected);
if (item != null)
{
User user = db.Users.Find(id);
user.RegimeItems.Remove(item);
}
RedirectToAction("ExerciseIndex");
}
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)
{
return db.Users
.Where(u => u.UserID == user.UserID)
.SelectMany(u => u.RegimeItems)
.ToList();
}
Models 楷模
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; }
}
View (Segment only) 查看 (仅限细分)
<input type="submit" name="remove"
id="remove" value="<<" />
</td>
<td valign="top">
@Html.ListBoxFor(model => model.RequestedExercises, new MultiSelectList(Model.RequestedExercises, "RegimeItemID", "RegimeExercise.Name", Model.RequestedSelected))
</td>
Your model.RequestedExercises list doesn't have a RegimeItemID property. 您的model.RequestedExercises列表没有RegimeItemID属性。 It's a list of items.
这是物品清单。 I suspect what you actually want is more like:
我怀疑您真正想要的更像是:
foreach(int selected in RequestedSelected)
{
RegimeItem item = model.RequestedExercises.FirstOrDefault(i => i.RegimeItemID == selected);
if(item != null)
{
User user = db.Users.Find(id);
user.RegimeItems.Remove(item);
}
}
Hopefully, this gets you on the right track. 希望这能使您走上正确的道路。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.