我的视图模型 collection 没有绑定

My viewmodel collection isn't binding

我不知道为什么这不起作用。

这是我模型的一部分:

public class AddComplianceReportViewModel 
{
    public PartyViewModel[] InvolvedParties { get; set; }
    public PartyViewModel[] ManagementParties { get; set; }
    public ConcealPartyViewModel[] ConcealParties { get; set; }

    public string ReportedByFirstName { get; set; }
    public string ReportedByLastName { get; set; }
    public string ReportedByBestTimeToContact { get; set; }
    public bool ReportedByRemainAnonymous { get; set; }

    [Phone]
    public string ReportedByPhone { get; set; }

    [EmailAddress]
    public string ReportedByEmail { get; set; }

    public string GeneralDescription { get; set; }
    public string DetaledDescription { get; set; }
}

public class PartyViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Title { get; set; }
}

public class ConcealPartyViewModel : PartyViewModel
{
    public string ConcealmentDescription { get; set; }
}

我控制器的相关代码:

[HttpGet, Route("report/new")]
public ViewResult FileReport()
{
    var vm = new AddComplianceReportViewModel()
    {
        ReportedByFirstName = "amy",
        ReportedByLastName = "lastname",
        ReportedByEmail = "my@email.com",
        ReportedByBestTimeToContact = "best time",
        ReportedByPhone = "555-123-4567",
        ReportedByRemainAnonymous = false,
        InvolvedParties = new []
        {
            new PartyViewModel()
            {
                FirstName = "saul",
                LastName = "goodman",
                Title = "lawyer"
            },
            new PartyViewModel()
            {
                FirstName = "walter",
                LastName = "white",
                Title = "cook"
            },
            new PartyViewModel()
            {
                FirstName = "jesse",
                LastName = "pinkman",
                Title = "lackey"
            }
        },
        ManagementParties = new PartyViewModel[]
        {
            new PartyViewModel()
            {
                FirstName = "Gus",
                LastName = "Freng",
                Title = "Boss"
            }
        },
        ConcealParties = new ConcealPartyViewModel[]
        {
            new ConcealPartyViewModel()
            {
                FirstName = "Skyler",
                LastName = "White",
                Title = "Wife",
                ConcealmentDescription = "money laundering"
            },
            new ConcealPartyViewModel()
            {
                FirstName = "Mike",
                LastName = "Ehrmantraut",
                Title = "Enforcer",
                ConcealmentDescription = "hid the bodies"
            }
        },

        GeneralDescription = "general description",
        DetaledDescription = "detailed description"
    };

    return View(vm);
}

[HttpPost, Route("report/new", Name = RouteNames.PostReport)]
public ActionResult FileReport(AddComplianceReportViewModel vm)
{
    return View(vm);
}

不知道有没有必要分享一下。有很多视图代码可以缩减为相关位。如果需要我可以添加我的观点。

这是我的浏览器发送到上面第二个控制器方法的表单数据:

ReportedByFirstName=amy&ReportedByLastName=latname&ReportedByPhone=%28555%29+123-4567&ReportedByEmail=my%40email.com&ReportedByBestTimeToContact=best+time&%5B0%5D.FirstName=saul&%5B0%5D.LastName=goodman&%5B0%5D.Title=lawyer&%5B1%5D.FirstName=walter&%5B1%5D.LastName=white&%5B1%5D.Title=cook&%5B2%5D.FirstName=jesse&%5B2%5D.LastName=pinkman&%5B2%5D.Title=lackey&%5B0%5D.FirstName=Gus&%5B0%5D.LastName=Freng&%5B0%5D.Title=Boss&GeneralDescription=general+description&Duration=&AwarenessReason=&AwarenessReason=&%5B0%5D.FirstName=Skyler&%5B0%5D.LastName=White&%5B0%5D.Title=Wife&%5B0%5D.ConcealmentDescription=money+laundering&%5B1%5D.FirstName=Mike&%5B1%5D.LastName=Ehrmantraut&%5B1%5D.Title=Enforcer&%5B1%5D.ConcealmentDescription=hid+the+bodies

无法阅读,所以这里是 Fiddler 提供的图像(并非所有字段都适合图像):

正如您在下图中看到的,collection 中的 none 正在填充:

我需要做什么才能填充这些内容?我不知所措。我在 Fiddler 屏幕截图中注意到派对 collection 不明确。我如何告诉 MVC "this group is ConcealedParties, this group is ManagementParties" 等?

==================根据请求,浏览量================

_Parties.cshtml

@model Redacted.Web.Models.Home.PartyViewModel[]

<div class="row">
    <div>@Html.Label("First Name")</div>
    <div>@Html.Label("Last Name")</div>
    <div>@Html.Label("Title")</div>
</div>

@for (var i = 0; i < Model.Count(); i++)
{
    <div class="row">
        <div class="columns medium-1">&nbsp;</div>
        <div class="columns medium-3">
            @Html.EditorFor(model => model[i].FirstName)
        </div>
        <div class="columns medium-3">
            @Html.EditorFor(model => model[i].LastName)
        </div>
        <div class="columns medium-3">
            @Html.EditorFor(model => model[i].Title)
        </div>
    </div>
}

主视图

@using (Html.BeginForm("FileReport", "Home", FormMethod.Post))
{
    @Html.Partial("_Parties", Model.InvolvedParties ?? new PartyViewModel[] { })
}

ManagementParties collection 也是如此。 ConcealedParties collection 有不同的分部视图,但分部的加载方式相同。

您需要将您的部分视图发送给您的 整个 主模型,然后使用该模型访问字段。由于您没有这样做,您的字段名称格式不正确,因此模型绑定无法做到这一点。

请参阅此处(来自您的表单数据):

[0].FirstName

应该是:

InvolvedParties[0].FirstName

但它不能以 InvolvedParties 作为前缀,因为您的局部视图认为顶级模型就是列表本身,因此省略了 InvolvedParties

另一个防止模型中出现 null 集合的提示,只需使用合并在模型构造函数中初始化它们:

public AddComplianceReportViewModel ()
{
    InvolvedParties = InvolvedParties ?? new PartyViewModel[] { };
}