我试图让列表框正常工作,这将非常像这样。
Available
练习是从迁移/配置中播种的。我需要能够将每个练习的倍数从Available
添加到Selected Regime
。我正在使用视图模型从另一个项目(User
和RegimeItems
)访问多个模型。然而,我只是不知所措。
Controller.cs
[HttpGet]
public ActionResult Exercise(int? id)
{
User user = db.Users.Find(id);
UserExerciseViewModel model = new UserExerciseViewModel { AvailableExercises = GetAllExercises(), RequestedExercises = new List<RegimeItem>() };
return View(model);
}
//Post
[HttpPost]
public ActionResult Index(UserExerciseViewModel model, string add, string remove, string send, int id)
{
User user = db.Users.Find(id);
//ModelState.Clear();
RestoreSavedState(model);
if (!string.IsNullOrEmpty(add))
AddExercises(model);
else if (!string.IsNullOrEmpty(remove))
SaveState(model);
return View(model);
}
void SaveState(UserExerciseViewModel model)
{
model.SavedRequested = string.Join(",", model.RequestedExercises.Select(p => p.RegimeItemID.ToString()).ToArray());
model.AvailableExercises = GetAllExercises().Except(model.RequestedExercises).ToList();
}
void RemoveExercises(UserExerciseViewModel model)
{
if (model.RequestedSelected != null)
{
model.RequestedExercises.RemoveAll(p => model.RequestedSelected.Contains(p.RegimeItemID));
model.RequestedSelected = null;
}
}
void AddExercises(UserExerciseViewModel model)
{
if (model.AvailableSelected != null)
{
var prods = GetAllExercises().Where(p => model.AvailableSelected.Contains(p.RegimeItemID));
model.RequestedExercises.AddRange(prods);
model.AvailableSelected = null;
}
}
void RestoreSavedState(UserExerciseViewModel model)
{
model.RequestedExercises = new List<RegimeItem>();
//get the previously stored items
if (!string.IsNullOrEmpty(model.SavedRequested))
{
string[] prodids = model.SavedRequested.Split(',');
var prods = GetAllExercises().Where(p => prodids.Contains(p.RegimeItemID.ToString()));
model.RequestedExercises.AddRange(prods);
}
}
public ViewResult Done()
{
return View();
}
public List<RegimeItem> GetAllExercises()
{
var items = db.RegimeItems.ToList();
}
UserExerciseViewModel.cs
namespace FaceToFaceWebsite.Models
{
public class UserExerciseViewModel
{
public List<RegimeItem> AvailableExercises { get; set; }
public List<RegimeItem> RequestedExercises { get; set; }
public int[] AvailableSelected { get; set; }
public int[] RequestedSelected { get; set; }
public string SavedRequested { get; set; }
}
}
迁移/ Configuration.cs
protected override void Seed(FaceToFace.Model.F2FData context)
{
var ahPose = new Pose { Name = "Ah" };
还有很多其他信息指定了pose
/ Exercise
,但它与问题无关。
查看 - Exercise.cs
<%using(Html.BeginForm()){ %>
<div>
<table>
<thead>
<tr>
<th>Available</th>
<th>
</th>
<th>Selected</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top">
<%=Html.ListBoxFor(model => model.AvailableExercises,
new MultiSelectList(Model.AvailableExercises, "RegimeItemID",
"Name", Model.AvailableSelected))%>
</td>
<td valign="top">
<input type="submit" name="add"
id="add" value=">>" /><br />
<input type="submit" name="remove"
id="remove" value="<<" />
</td>
<td valign="top">
<%=Html.ListBoxFor(model => model.RequestedSelected,
new MultiSelectList(Model.RequestedExercises, "RegimeItemID",
"Name", Model.RequestedSelected))%>
</td>
</tr>
</tbody>
</table>
<br />
<%=Html.HiddenFor(model=>model.SavedRequested) %>
</div>
<%} %>
我要做的是允许专门为每个用户分配练习。这些练习已经播种了。当这种方法正常工作时,它应该允许以降序访问练习。
更新
根据斯蒂芬斯的建议,我得到的代码至少不会抛出任何错误。
然而,这是我现在在练习页面上收到的图片。
更新2
根据Stephen的帮助,我对下面的 Excercise.cshtml 视图进行了更改。
@model FaceToFaceWebsite.Models.UserExerciseViewModel
@using (Html.BeginForm())
{
<div>
<table>
<thead>
<tr>
<th>Available</th>
<th>
</th>
<th>Selected</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top">
@Html.ListBoxFor(model => model.AvailableExercises, new MultiSelectList(Model.AvailableExercises, "RegimeItemID", "RegimeExercise", Model.AvailableSelected))
</td>
<td valign="top">
<input type="submit" name="add"
id="add" value=">>" /><br />
<input type="submit" name="remove"
id="remove" value="<<" />
</td>
<td valign="top">
@Html.ListBoxFor(model => model.RequestedSelected, new MultiSelectList(Model.RequestedExercises, "RegimeItemID", "RegimeExercise", Model.RequestedSelected))
</td>
</tr>
</tbody>
</table>
<br />
@Html.HiddenFor(model => model.SavedRequested)
</div>
}
我现在将其作为下面图片中显示的列表框。
我不确定这个问题是否存在于site.css中,但是它更有可能找不到播种的练习。
答案 0 :(得分:0)
根据Stephens的帮助,我能够让它工作,另一方面,似乎我正在使用其中一个模型错误.Stephen提供的信息让我没有错误的构建,无论我的失败在我发布问题之前。最后一个问题不是在评论中提到的css,它可能是,但之前的问题是我需要使用多个模型来进行练习。
这是viewmodel。
namespace FaceToFaceWebsite.Models
{
public class UserExerciseViewModel
{
public List<RegimeItem> AvailableExercises { get; set; }
public List<RegimeItem> RequestedExercises { get; set; }
public int[] AvailableSelected { get; set; }
public int[] RequestedSelected { get; set; }
public string SavedRequested { get; set; }
}
}
Controller.cs
//GET
[HttpGet]
public ActionResult Exercise(int? id)
{
User user = db.Users.Find(id);
UserExerciseViewModel model = new UserExerciseViewModel { AvailableExercises = GetAllExercises(), RequestedExercises = new List<RegimeItem>() };
return View(model);
}
//Post
[HttpPost]
public ActionResult Index(UserExerciseViewModel model, string add, string remove, string send, int id)
{
User user = db.Users.Find(id);
//ModelState.Clear();
RestoreSavedState(model);
if (!string.IsNullOrEmpty(add))
AddExercises(model);
else if (!string.IsNullOrEmpty(remove))
SaveState(model);
return View(model);
}
void SaveState(UserExerciseViewModel model)
{
model.SavedRequested = string.Join(",", model.RequestedExercises.Select(p => p.RegimeItemID.ToString()).ToArray());
model.AvailableExercises = GetAllExercises().Except(model.RequestedExercises).ToList();
}
void RemoveExercises(UserExerciseViewModel model)
{
if (model.RequestedSelected != null)
{
model.RequestedExercises.RemoveAll(p => model.RequestedSelected.Contains(p.RegimeItemID));
model.RequestedSelected = null;
}
}
void AddExercises(UserExerciseViewModel model)
{
if (model.AvailableSelected != null)
{
var prods = GetAllExercises().Where(p => model.AvailableSelected.Contains(p.RegimeItemID));
model.RequestedExercises.AddRange(prods);
model.AvailableSelected = null;
}
}
void RestoreSavedState(UserExerciseViewModel model)
{
model.RequestedExercises = new List<RegimeItem>();
//get the previously stored items
if (!string.IsNullOrEmpty(model.SavedRequested))
{
string[] prodids = model.SavedRequested.Split(',');
var prods = GetAllExercises().Where(p => prodids.Contains(p.RegimeItemID.ToString()));
model.RequestedExercises.AddRange(prods);
}
}
public ViewResult Done()
{
return View();
}
private List<RegimeItem> GetAllExercises()
{
return db.RegimeItems.ToList();
}
和视图。
@model FaceToFaceWebsite.Models.UserExerciseViewModel
@using (Html.BeginForm())
{
<div>
<table>
<thead>
<tr>
<th>Available</th>
<th>
</th>
<th>Selected</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top">
@Html.ListBoxFor(model => model.AvailableExercises, new MultiSelectList(Model.AvailableExercises, "RegimeItemID", "RegimeExercise", Model.AvailableSelected))
</td>
<td valign="top">
<input type="submit" name="add"
id="add" value=">>" /><br />
<input type="submit" name="remove"
id="remove" value="<<" />
</td>
<td valign="top">
@Html.ListBoxFor(model => model.RequestedSelected, new MultiSelectList(Model.RequestedExercises, "RegimeItemID", "RegimeExercise", Model.RequestedSelected))
</td>
</tr>
</tbody>
</table>
<br />
@Html.HiddenFor(model => model.SavedRequested)
</div>
}