【发布时间】:2016-11-13 08:46:39
【问题描述】:
我正在创建一个视图,允许用户以客户想要的特定方式添加和删除列表中的对象。用户必须能够在提交之前在页面上添加或删除多个表单。当页面发布时,它需要显示列表中已有的内容,并可以选择删除每个项目,并允许用户在再次提交之前添加/删除更多对象。
我可以使用 JQuery 和 Partial View 让用户在提交之前添加或删除新表单。我想不通的是如何提供一个按钮来从以前的提交中删除列表中已经存在的对象。
谁能帮我解决这个问题?将不胜感激。
这是我到目前为止所想出的。 在我看来:
@using (Html.BeginForm())
{
<div id="recipients">
@foreach (var p in Model)
{
@Html.Partial("_Recipient", p)
}
<div id="recipients0"></div>
</div>
<button id="add" type="button">Add</button>
<button id="remove" type="button">Remove</button>
<input type="submit" value="Save" />
}
<script type="text/javascript">
$('#add').click(function () {
var url = '@Url.Action("Recipient")';
var div = $('#recipients');
var divlast = $('div[id^="recipients"]:last');
var num = parseInt(divlast.prop("id").match(/\d+/g), 10) + 1;
var newdiv = $(document.createElement('div')).attr('id', 'recipients' + num)//rest of code
$.get(url, function (response) {
div.append(newdiv);
newdiv.append(response);
});
})
$('#remove').click(function () {
var div = $('#recipients');
var divlast = $('div[id^="recipients"]:last');
var num = parseInt(divlast.prop("id").match(/\d+/g), 10);
alert("div[id='recipients" + num + "']");
$("div[id='recipients" + num + "']").remove();
//div.remove('div[id^="recipients' + num + '"]');
})
带有向新对象添加数据的表单的部分视图:
@using (Html.BeginCollectionItem("recipients"))
{
@Html.HiddenFor(m => m.ID)
@Html.LabelFor(m => m.Recipient)
@Html.TextBoxFor(m => m.Recipient)
@Html.ValidationMessageFor(m => m.Recipient)
<br />
@Html.LabelFor(m => m.Amount)
@Html.TextBoxFor(m => m.Amount)
@Html.ValidationMessageFor(m => m.Amount)
}
<td>
@Ajax.ActionLink(
"Remove",
"Remove",
"CashRecipients",
new AjaxOptions
{
HttpMethod = "POST",
OnSuccess = "onDeleteSuccess"
}
)
</td>
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
<script>
var onDeleteSuccess = function (result) {
alert('Howdy');
};
</script>
我的控制器:
public PartialViewResult Recipient()
{
return PartialView("_Recipient", new CashRecipientViewModel());
}
// GET:
public ActionResult Create()
{
List<CashRecipientViewModel> model = new List<CashRecipientViewModel>();
return View(model);
}
// POST: CashRecipients/Create
[HttpPost]
public ActionResult Create([Bind(Include = "ID,Amount,Recipient")] IEnumerable<CashRecipientViewModel> recipients)
{
return View(recipients);
}
我的视图模型:
public class CashRecipientViewModel
{
public int? ID { get; set; }
public decimal Amount { get; set; }
[Required(ErrorMessage = "Please enter the name of the recipient")]
public string Recipient { get; set; }
}
【问题讨论】:
-
你没有显示部分(我假设你使用
BeginCollectionItem())。封闭<div>元素的id属性有什么意义(这是不必要的)。我为什么没有与每个元素关联的删除按钮(用户想要删除 10 个列表中的第三个?) -
我编辑了问题以添加部分内容。封闭 div 元素的 id 属性用于底部删除按钮的 jquery。包括与每个元素关联的删除按钮正是我要问的。
-
您可以在此处看到它正在运行:dynamicform.azurewebsites.net/CashRecipients/Create 底部的删除按钮用于在提交表单之前将其删除。部分视图中的删除操作链接当前正在调用一个空方法...我不知道如何从那里获取列表上的范围。
-
您没有显示部分(带有
BeginCollectionItem()和用于编辑模型的表单控件。而且您没有(也不应该)为这些div 生成id属性。您partial 需要一个带有类名的按钮,并且您处理按钮单击事件以删除关联的表单控件(在现有项目的情况下,使用 ajax 调用服务器方法将其删除,或“标记”模型以进行删除)跨度> -
对不起,遗漏了部分视图代码;编辑添加它。请查看主视图 JQuery 是如何使用这些 id 属性的——这很有意义。使用 ajax 调用服务器方法是部分中的操作链接已经在做的事情。我只是不知道如何通过整个列表。
标签: jquery asp.net-mvc asp.net-mvc-partialview begincollectionitem