我的视图模型 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"> </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[] { };
}
我不知道为什么这不起作用。
这是我模型的一部分:
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"> </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[] { };
}