【发布时间】:2017-03-25 04:09:05
【问题描述】:
我做了一个小项目来了解 Stephen Muecke 的答案:Submit same Partial View called multiple times data to controller?
几乎一切正常。 javascript 从局部视图中添加新字段,我可以通过控制器方法为局部视图插入的“临时”值来判断它们已绑定到模型。
但是,当我提交新字段时,AddRecord() 方法会引发异常,表明模型没有被传入(“对象引用未设置为对象的实例”)。
另外,当我查看页面源代码时,BeginCollectionItem 助手正在插入一个隐藏标记,因为它应该在显示预先存在的记录的主视图中的表周围插入一个隐藏标记,而不是在 javascript 添加的新字段周围。
我做错了什么?我对此很陌生,所以感谢您的耐心等待!
我的主要观点:
@model IEnumerable<DynamicForm.Models.CashRecipient>
@using (Html.BeginForm("AddDetail", "CashRecipients", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div id="CSQGroup">
</div>
}
<div>
<input type="button" value="Add Field" id="addField" onclick="addFieldss()" />
</div>
<script>
function addFieldss()
{
//alert("ajax call");
$.ajax({
url: '@Url.Content("~/CashRecipients/RecipientForm")',
type: 'GET',
success:function(result) {
//alert("Success");
var newDiv = document.createElement("div");
var newContent = document.createTextNode("Hi there and greetings!");
newDiv.appendChild(newContent);
newDiv.innerHTML = result;
var currentDiv = document.getElementById("div1");
document.getElementById("CSQGroup").appendChild(newDiv);
},
error: function(result) {
alert("Failure");
}
});
}
</script>
我的部分观点:
@model DynamicForm.Models.CashRecipient
@using HtmlHelpers.BeginCollectionItem
@using (Html.BeginCollectionItem("recipients"))
{
<div class="editor-field">
@Html.LabelFor(model => model.Id)
@Html.LabelFor(model => model.cashAmount)
@Html.TextBoxFor(model => model.cashAmount)
@Html.LabelFor(model => model.recipientName)
@Html.TextBoxFor(model => model.recipientName)
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
}
我的模特:
public class CashRecipient
{
public int Id { get; set; }
public string cashAmount { get; set; }
public string recipientName { get; set; }
}
在我的控制器中:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddDetail([Bind(Include = "Id,cashAmount,recpientName")] IEnumerable<CashRecipient> cashRecipient)
{
if (ModelState.IsValid)
{
foreach (CashRecipient p in cashRecipient) {
db.CashRecipients.Add(p);
}
db.SaveChanges();
return RedirectToAction("Index");
}
return View(cashRecipient);
}
public ActionResult RecipientForm()
{
var data = new CashRecipient();
data.cashAmount = "temp";
data.recipientName = "temp";
return PartialView(data);
}
【问题讨论】:
-
您不能将
Html.BeginCollectionItem()应用于作为集合的模型 - 它应用于单个对象。而且您的视图甚至没有为 typeofCashRecipient创建可编辑控件。代码中有许多错误,但不清楚您在这里尝试做什么。您是否想要一个可以动态添加(和/或删除)新CashRecipient并回发集合的表单? -
我正在尝试做 Brajesh 在您帮助他解决的问题中尝试做的完全相同的事情。我使用与他相同的 javascript 和大致相同的部分视图代码,除了使用 CashRecipient 而不是他的模型 AdminProductDetailModel。添加的每个控件都用于单个对象。模型本身不是一个集合。我认为 BeginCollectionItem 将多个控件的数据包装为一个集合......我可能误解了。你能帮我理解吗?
-
在我的第一条评论中回答这个问题 :) 你为什么要使用
DisplayFor()- 它只是呈现文本,意味着没有什么是可编辑的 -
DisplayFor() 只是在显示现有项目的表中。与 Bajesh 的查询匹配的部分在下面,从 id 为 CSQGroup 的 div 开始。如果有帮助,您可以忽略整个表格,我可能不应该将其包括在内。是的,我想要一个可以动态添加新 CashRecipient 控件并回发多个 CashRecipient 实例的表单。
-
Bajesh 不存在与此问题相关的问题,因此请停止引用它。您是否还有不想编辑现有
CashRecipient对象的特殊原因?
标签: javascript asp.net-mvc model-binding asp.net-mvc-partialview begincollectionitem