当前位置:  开发笔记 > 编程语言 > 正文

将未知数量的Input元素绑定到MVC5中的模型

如何解决《将未知数量的Input元素绑定到MVC5中的模型》经验,为你挑选了1个好方法。

我是MVC5和C#的新手,我正在努力实现一些我不完全理解的东西.

我有一个像这样的团队模型:

public class Team
{
    [Key]
    public Guid ID { get; set; }
    public string TeamName { get; set; }
    public string Coach { get; set; }
    public string Conference { get; set; }
}

我也有像这样的玩家模型:

public class Player
{
    [Key]
    public Guid Id { get; set; }
    [ForeignKey("Teams")]
    public Guid TeamId { get; set; }
    public string Name { get; set; }
    public virtual Team Teams { get; set; }
}

查看模型是

public class TeamViewModel
{
    public string TeamName { get; set; }
    public string Coach { get; set; }
    public string Conference { get; set; }
    public List Players { get; set; }
}

通过这种结构,您可以为每个团队添加无限数量的玩家.因此,我有一个具有少量属性的Teams表和一个包含玩家名称以及玩家TeamId的Player表,以便我们知道他们属于哪个团队.

当我创建团队时,我的问题出现了.我有这样的Create Controller:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task Create(TeamViewModel model)
{
    if (ModelState.IsValid)
    {
        var team = new Team { TeamName = model.TeamName, Coach = model.Coach, Conference = model.Conference, Player = model.Player };
        db.Teams.Add(team);
        var result = await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View();
}

我的观点如下:

@model SoccerTeams.Models.ViewModels.TeamViewModel
@{
    ViewBag.Title = "Create";
}

Create

@using (Html.BeginForm()) { @Html.AntiForgeryToken()

Team


@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.TeamName, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.TeamName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.TeamName, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.Coach, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Coach, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Coach, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.Conference, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Conference, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Conference, "", new { @class = "text-danger" })
@if (@Model != null) { foreach (var p in Model.Player) {
@Html.Raw("")
@Html.Raw("
} } else {
@Html.Raw("")
@Html.Raw("
}
}
@Html.ActionLink("Back to List", "Index")
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }

根据我的理解,View假设能够将input元素转换为列表并将其传递给我的ViewModel.但是,我的ViewModel始终为null.

我错过了什么,我将如何使这项工作?

PS我明白我可以使用Html.EditorFor,但我无法使其工作,所以我只是将其打印为Html,因为我需要首先解决我的其他问题.

编辑

我已将视图更改为具有以下代码

@Html.Raw("")
@Html.Raw("

因此,模型现在可以正确填充Players Array,但是所有其他值现在都变为null.如果我删除了输入元素,则会填充值,但是player数组再次为null,因为没有表单字段.你知道什么可能是罪魁祸首吗?

在TeamViewModel中,我还将Player重命名为Players.



1> gyosifov..:

为了让MVC将表单数据绑定到Action方法的参数,它们的名称应该匹配.

假设您的ViewModel具有List Players代码属性应该是:

在你的情况下:

foreach (var p in Model.Player)
            {
                
@Html.Raw("")
@Html.Raw("
}

应该:

for (int i = 0; i < Model.Player.Length; i++)
            {
                
@Html.Raw("")
@Html.Raw("
}

因为这是您提供的参数的名称:

Create(TeamViewModel model)

另外要小心,因为索引不应该被破坏,这意味着它们应该是0,1,2 ......等而不会跳过一个数字.

我们在属性中读取的方式是查找parameterName [index] .PropertyName.索引必须从零开始且不间断.

注:你可以阅读更多关于斯科特Hanselman的结合后的集合- 在这里


最后我建议如果你有一个属性列表的属性 - 在你的案例列表中Player使用复数形式的属性名称 - Players.

编辑

尝试删除"模型".在名字的前面.使它像这样的"玩家[0] .Name".由于您在Create Action方法中只有一个参数,因此应该没问题.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有