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

时间:2014-10-23 16:18:48

标签: c# asp.net-mvc

好的,我有3个型号。 WorkoutViewModel与WorkoutExerciseViewModel有一对多的关系。 WorkoutExerciseViewModel与ExerciseSetViewModel有一对多的关系。我需要一个动态的“创建视图”,这将允许我动态地向练习添加练习,并设置为练习。然后我想保存包括所有练习的锻炼并将记录设置回数据库。我只需要验证所创建的锻炼至少有1次锻炼,并且至少创建了1次锻炼。最后,我只需要将一个Workout View Model推回到控制器,并且所有填充的嵌套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; }
}

1 个答案:

答案 0 :(得分:0)

除了可以在StackOverflow答案中合理地讨论之外,还有更多内容,但我会给你足够的开头。

至于在这些练习中添加新的练习和设置,那就是JavaScript。您需要有一个用户可以单击以添加新按钮的按钮,并将该按钮上的click事件绑定到将向页面添加适当的HTML(表单字段等)的处理程序。有很多不同的方法可以做到这一点,有些方法比其他方法更难。您最有可能想要查看一些JavaScript模板库或更完整的堆栈JS库(如Knockout)以简化操作。唯一要记住的是模型绑定器用于连接从邮政主体到模型实例的所有内容的约定。对于集合,它期望字段具有CollectionPropertyName[N].PropertyBeingEdited形式的名称属性,其中N是集合中的位置。因此,第一个练习的ExerciseFullName的名称属性为WorkoutExercises[0].ExerciseFullName

您的帖子操作只会采用相同的主视图模型:

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

只要您遵循表单中所有字段的属性命名约定,模型绑定器就会很乐意将帖子正文中的所有内容连接到WorkoutViewModel实例。