动态创建具有多个嵌套IEnumerable对象的视图
本文关键字:IEnumerable 对象 视图 嵌套 创建 动态 | 更新日期: 2023-09-27 18:27:46
好的,我有三个模型。WorkoutViewModel与WorkoutExerciseViewModel具有一对多关系。WorkoutExerciseViewModel与ExerciseSetViewModel具有一对多关系。我需要一个动态的"创建视图",这将允许我动态添加练习到锻炼,并设置到练习。然后我想保存一个包括所有锻炼的锻炼,并将记录设置回数据库。我只需要验证创建的锻炼是否至少有一个练习,创建的锻炼至少有一套。最终,我只需要将一个Workout视图模型推回到控制器,并显示所有已填充的嵌套IEnumberable对象。有人能给我指正确的方向吗?
public class WorkoutViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtal IEnumerable<WorkoutExerciseViewModel> WorkoutExercises { get; set;}
}
public class WorkoutExerciseViewModel
{
public int Id { get; set; }
public int WorkoutId { get; set; }
public int ExerciseId { get; set; }
public virtual ExerciseViewModel Exercise { get; set; }
public virtual IEnumerable<ExerciseSetViewModel> ExerciseSets { get; set; }
public string ExerciseFullname
{
get
{
return Exercise.Equipment.Name + " " + Exercise.Name;
}
}
}
public class ExerciseSetViewModel
{
public int Id { get; set; }
public int WorkoutExerciseId { get; set; }
public int Set { get; set; }
public int Reps { get; set; }
public int Weight { get; set; }
public string WeightValueType { get; set; }
}
这确实比StackOverflow答案中合理讨论的要多,但我会给你足够的答案。
就在这些练习中添加新的练习和集合而言,这只是JavaScript。您需要有一些用户可以单击的按钮来添加新的按钮,并将该按钮上的单击事件绑定到一个处理程序,该处理程序将向页面添加适当的HTML(表单字段等)。要做到这一点有很多不同的方法,有些方法比其他方法更难。你很可能想研究一些JavaScript模板库,或者像Knockout这样的全栈JS库,让事情变得更容易。唯一需要记住的另一件事是modelbinder用来连接从帖子正文到模型实例的所有内容的约定。对于集合,它希望字段具有CollectionPropertyName[N].PropertyBeingEdited
形式的名称属性,其中N
是集合中的位置。因此,第一个练习的ExerciseFullName
的名称属性将是WorkoutExercises[0].ExerciseFullName
。
你的后期操作只需采用相同的主视图模型:
[HttpPost]
public ActionResult Create(WorkoutViewModel model)
{
...
}
只要您遵循表单中所有字段的属性命名约定,modelbinder就会很高兴地将post正文中的所有内容连接到WorkoutViewModel
实例上。