动态创建具有多个嵌套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; }
}

动态创建具有多个嵌套IEnumerable对象的视图

这确实比StackOverflow答案中合理讨论的要多,但我会给你足够的答案。

就在这些练习中添加新的练习和集合而言,这只是JavaScript。您需要有一些用户可以单击的按钮来添加新的按钮,并将该按钮上的单击事件绑定到一个处理程序,该处理程序将向页面添加适当的HTML(表单字段等)。要做到这一点有很多不同的方法,有些方法比其他方法更难。你很可能想研究一些JavaScript模板库,或者像Knockout这样的全栈JS库,让事情变得更容易。唯一需要记住的另一件事是modelbinder用来连接从帖子正文到模型实例的所有内容的约定。对于集合,它希望字段具有CollectionPropertyName[N].PropertyBeingEdited形式的名称属性,其中N是集合中的位置。因此,第一个练习的ExerciseFullName的名称属性将是WorkoutExercises[0].ExerciseFullName

你的后期操作只需采用相同的主视图模型:

[HttpPost]
public ActionResult Create(WorkoutViewModel model)
{
    ...
}

只要您遵循表单中所有字段的属性命名约定,modelbinder就会很高兴地将post正文中的所有内容连接到WorkoutViewModel实例上。

相关文章: