C# MVC从子集合添加和删除项

C# MVC从子集合添加和删除项,c#,asp.net-mvc,razor,collections,model-binding,C#,Asp.net Mvc,Razor,Collections,Model Binding,我无法将数据绑定到集合项的集合(我也无法正确表述我的问题)。让我们通过使用psudo模型的示例,让每个人都更容易理解 假设我有以下示例模型: public class Month() { public int ID { get; set; } public string Name { get; set; } public virtual ICollection<Week> Weeks { get; set; } } public class Week() {

我无法将数据绑定到集合项的集合(我也无法正确表述我的问题)。让我们通过使用psudo模型的示例,让每个人都更容易理解

假设我有以下示例模型:

public class Month()
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Week> Weeks { get; set; }
}

public class Week()
{
    public int ID { get; set; }
    public int MonthID { get; set; }
    public String Name { get; set; }
    public virtual ICollection<Day> Days { get; set; }
}

public class Day()
{
    public int ID { get; set; }
    public String Name { get; set; }
}

我如何确保在提交表单时,所选日期将绑定到周?

看起来最简单的方法是将表单的目标设置为填充类型为
IEnumerable
的数据结构,其中
DayModel
定义为:

public class DayModel
{
    public int WeekId { get; set; }
    public int DayId { get; set; }
    public bool IsIncluded { get; set; }
}
您可以保持Razor代码在大多数情况下保持原样,但在呈现复选框时,您可以执行以下操作:

@{
    var modelIdx = 0;
}

// ...

<input type="hidden" name="days[@modelIdx].WeekId" value="@Model.Weeks[i].Id" />
<input type="hidden" name="days[@modelIdx].DayId" value="@Model.AllDays[d].Id" />
<input type="checkbox" name="days[@modelIdx].IsIncluded" value="@(Model.Weeks[i].Days.Contains(Model.AllDays[d]) ? "checked" : "")" />
@{ modelIdx++; }
@{
var modelIdx=0;
}
// ...
@{modelIdx++;}
然后,您发布到的控制器操作可能具有以下签名:

[HttpPost]
public ActionResult Edit(IEnumerable<DayModel> days)
{
    //...
}
[HttpPost]
公共行动结果编辑(IEnumerable天)
{
//...
}

帮助我的是永远不要混淆视图模型,视图模型应该只用于视图模型(通常是获取操作)和非视图模型(我们称之为普通模型)。避免让您的POST操作尝试绑定到视图模型,这将大大简化您的生活。

看起来最简单的方法是让表单的目标是填充类型为
IEnumerable
的数据结构,其中
DayModel
定义为:

public class DayModel
{
    public int WeekId { get; set; }
    public int DayId { get; set; }
    public bool IsIncluded { get; set; }
}
您可以保持Razor代码在大多数情况下保持原样,但在呈现复选框时,您可以执行以下操作:

@{
    var modelIdx = 0;
}

// ...

<input type="hidden" name="days[@modelIdx].WeekId" value="@Model.Weeks[i].Id" />
<input type="hidden" name="days[@modelIdx].DayId" value="@Model.AllDays[d].Id" />
<input type="checkbox" name="days[@modelIdx].IsIncluded" value="@(Model.Weeks[i].Days.Contains(Model.AllDays[d]) ? "checked" : "")" />
@{ modelIdx++; }
@{
var modelIdx=0;
}
// ...
@{modelIdx++;}
然后,您发布到的控制器操作可能具有以下签名:

[HttpPost]
public ActionResult Edit(IEnumerable<DayModel> days)
{
    //...
}
[HttpPost]
公共行动结果编辑(IEnumerable天)
{
//...
}

帮助我的是永远不要混淆视图模型,视图模型应该只用于视图模型(通常是获取操作)和非视图模型(我们称之为普通模型)。避免让您的POST操作尝试绑定到视图模型,这将大大简化您的生活。

您遇到了哪些问题/错误?我们可以看到处理此表单帖子的控制器操作吗?我还想看到填充ViewModel的控制器操作。有趣的是,Month类已经有了对Weeks的引用和对Days(通过Weeks)的间接引用,但是您已经将它们作为额外字段添加到了ViewModel中。为什么?我添加了一些psudo动作方法。我是MVC新手,我遵循的理念是视图不应该运行查询(在viewmodel中发送视图所需的所有内容)。如果你不认为有必要,那么我当然可以改变一下。我的主要问题(我很难解释)是,我不知道复选框的“name”属性需要是什么,以便模型绑定器指定日期。我将添加另一个小段落,更好地解释这种情况。RE“在viewmodel中发送视图所需的所有内容”-您已经通过为viewmodel提供
Month
属性来避免这种情况。Month类有一个周集合,而周集合又有一个日集合。无需为ViewModel提供这些集合的额外副本。关于您在了解如何将视图输入绑定到ViewModel字段时遇到的问题,本文将介绍如何有效地进行绑定。jist要求您不应该在视图中使用循环,而是使用editorTemplates。您遇到了哪些问题/错误?我们可以看到处理此表单帖子的控制器操作吗?我还想看到填充ViewModel的控制器操作。有趣的是,Month类已经有了对Weeks的引用和对Days(通过Weeks)的间接引用,但是您已经将它们作为额外字段添加到了ViewModel中。为什么?我添加了一些psudo动作方法。我是MVC新手,我遵循的理念是视图不应该运行查询(在viewmodel中发送视图所需的所有内容)。如果你不认为有必要,那么我当然可以改变一下。我的主要问题(我很难解释)是,我不知道复选框的“name”属性需要是什么,以便模型绑定器指定日期。我将添加另一个小段落,更好地解释这种情况。RE“在viewmodel中发送视图所需的所有内容”-您已经通过为viewmodel提供
Month
属性来避免这种情况。Month类有一个周集合,而周集合又有一个日集合。无需为ViewModel提供这些集合的额外副本。关于您在了解如何将视图输入绑定到ViewModel字段时遇到的问题,本文将介绍如何有效地进行绑定。jist是您不应该在视图中使用循环,而应该使用editorTemplates。