ASP.NET Core-将IEnumerable <t>绑定到POST上的ViewModel字段

时间:2019-02-06 14:08:24

标签: c# razor asp.net-core

我有一个Web应用程序,用于注册比赛团队,每个团队都可以选择他们将用于项目的多种技术。这些技术保存在Label类中。

我正在使用视图模型将信息从表单绑定到操作。 但是,当我尝试提交表单时,它将采用除技术列表以外的所有其他字段。

Label.cs

.*

CreateTeamViewModel.cs

$

TeamsController.cs

public class Label
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public string ColorPalette { get; set; }
}

Create.cshtml(复选框列表)

public class CreateTeamViewModel
{
    [Required]
    public string TeamName { get; set; }

    public string ProjectName { get; set; }

    public string ProjectDescription { get; set; }

    [Required]
    public string RepositoryLink { get; set; }

    public List<Label> Labels = new List<Label>();
}

1 个答案:

答案 0 :(得分:2)

您需要绑定到视图模型上的int列表,而不是Label列表。然后,您需要使用所选ID的列表来填充要保留的Team实体上的标签列表:

public class CreateTeamViewModel
{
    [Required]
    public string TeamName { get; set; }

    public string ProjectName { get; set; }

    public string ProjectDescription { get; set; }

    [Required]
    public string RepositoryLink { get; set; }

    public List<int> SelectedLabels { get; set; } = new List<int>();
}

然后,您需要修改表单以将复选框绑定到此列表:

@foreach (var label in labels)
{
    <input asp-for="SelectedLabels" id="Label@(label.Id)" value="@label.Id" type="checkbox" />
    <label id="Label@(label.Id)">
        <span class="badge badge-@label.ColorPalette">@label.Name</span>
    </label>
}

请注意,我删除了隐藏的输入。您应该从不发布任何用户无法修改的内容,因为即使隐藏的输入也可能被篡改。

发布后,在服务器端,您将获得由用户选择的标签ID的列表。只需从数据库中查询关联的标签,然后将其分配给您要创建的团队即可:

team.Labels = await _context.Set<Label>().Where(x => model.SelectedLabels.Contains(x.Id)).ToListAsync();