【发布时间】:2015-09-04 03:14:44
【问题描述】:
我有一个 MVC 表单,它比我所有的其他表单都复杂,使用了三个模型。
Company -> Base_IP -> RequestedIP ViewModel -> Partial1 -> Partial2
我正在使用 BeginCollectionItem,因为每个模型都有一个模型的属性列表。 IE - Company 有一个名为 baseIps 的属性,BaseIp 类有一个名为 requestedIps 的属性,返回 null 的 requestedIps,页面渲染时有计数,但提交时没有。
在postCreate() 中提交到数据库时,'requestedIps' 属性为空,这是为什么呢?
我在下面添加了有问题的控制器和部分代码示例,而不是全部,因为它是大量/冗余的 - 有任何问题,请告诉我。
控制器 - [HttpGet]Create()
public ActionResult Create()
{
var cmp = new Company
{
contacts = new List<Contact>
{
new Contact { email = "", name = "", telephone = "" }
}, pa_ipv4s = new List<Pa_Ipv4>
{
new Pa_Ipv4
{
ipType = "Pa_IPv4", registedAddress = false, existingNotes = "", numberOfAddresses = 0, returnedAddressSpace = false, additionalInformation = "",
requestedIps = new List<IpAllocation>
{
new IpAllocation { allocationType = "Requested", cidr = "", mask = "", subnet = "" }
}
}
}
};
return View(cmp);
}
控制器 - [HttpPost]Create()
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Company cmp) // does not contain properties assigned/added to in view render
{
if (ModelState.IsValid)
{
db.companys.Add(cmp);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(cmp);
}
创建视图
@model Company
@using (Html.BeginForm())
{
<div id="editorRowsAsn">
@foreach (var ip in Model.pa_ipv4s)
{
@Html.Partial("Pa_IPv4View", ip)
}
</div>
<br />
<div data-role="main" class="ui-content">
<div data-role="controlgroup" data-type="horizontal">
<input type="submit" class="ui-btn" value="Create" />
</div>
</div>
}
Pa_Ipv4 视图
@model Pa_Ipv4
@using (Html.BeginCollectionItem("pa_ipv4s"))
{
@Html.AntiForgeryToken()
<div id="editorRowsRIpM">
@foreach (var item in Model.requestedIps)
{
@Html.Partial("RequestedIpView", item)
}
</div>
@Html.ActionLink("Add", "RequestedManager", null, new { id = "addItemRIpM", @class = "button" }
}
RequestedIpView
@model IpAllocation
<div class="editorRow">
@using (Html.BeginCollectionItem("requestedIps"))
{
<div class="ui-grid-c ui-responsive">
<div class="ui-block-a">
<span>
@Html.TextBoxFor(m => m.subnet, new { @class = "checkFiller" })
</span>
</div>
<div class="ui-block-b">
<span>
@Html.TextBoxFor(m => m.cidr, new { @class = "checkFiller" })
</span>
</div>
<div class="ui-block-c">
<span>
@Html.TextBoxFor(m => m.mask, new { @class = "checkFiller" })
<span class="dltBtn">
<a href="#" class="deleteRow"><img src="~/Images/DeleteRed.png" style="width: 15px; height: 15px;" /></a>
</span>
</span>
</div>
</div>
}
</div>
【问题讨论】:
-
这是对对象的 html 请求反序列化的一个非常常见的问题。这对于这两个级别的层次结构来说是不平凡的。您需要查看 html 请求,查看请求变量是如何命名的。它们是否符合预期的默认绑定行为?
-
或者,构建一个 json 对象并发送它
-
我并没有真正使用过 JSON,你有没有链接让我看看如何在这种情况下使用它?默认绑定行为,即如果我只使用 Model -> partial 与 BCI,一切都很好 - 这就是你的意思吗?
标签: c# asp.net-mvc asp.net-mvc-4