我正在尝试在MVC应用程序中使用jQuery发布帖子,根据这个SO答案: Can jQuery do a POST of a ViewModel to a Controller in ASP.NET MVC?
不同之处在于我使用它来删除动态视图中的项目(更别提我直接发布删除的事实,这是一个通过授权的封闭网站,我将使用jQuery来确认,我只是不希望用户必须转到新页面)。因此我需要能够发送id和ViewModel(ViewModel在删除之前保存任何添加的项目)。我对这个解决方案并不是特别满意,但是在这一点上我只需要让它起作用!
所以我试图弄清楚如何根据上面的SO帖子发送id和ViewModel,但我无法弄清楚如何使用命名参数获取ViewModel。这不起作用:
$(".delete").click(function () {
$.ajax({
type: "POST",
url: deleteurl,
data: ({id : $(this).closest('tr').find('td:first').text(),vm: $('form').serialize()}),
cache: false,
success: function (html) {
$("#rows").html(html);
}
});
return false;
});
这是POST操作方法:
[HttpPost]
public ActionResult Delete(int id, LanguageViewModel vm)
{
for (int i = 0; i < vm.Languages.Count; i++)
{
var language = _repository.GetLanguage(vm.Languages[i].Id); //This is the key, get the original program object to update
UpdateModel(language, "Languages[" + i + "]");
}
_repository.Save();
//Delete code will go here
return RedirectToAction("Edit", "Languages", new { id = id });
//return View();
}
同样,它不起作用,甚至没有调试器中的action方法。如果我从action方法中删除了int id参数,它实际上就到了那里,但是vm = null。我不知道该怎么做,所以任何帮助将不胜感激!
编辑: 抱歉,返回值现在应该更改,而不是返回View()。
更新:
在Darin的帮助下,它几乎正常工作:
[HttpPost]
public ActionResult Delete(LanguageViewModel vm, FormCollection collection)
{
for (int i = 0; i < vm.Languages.Count; i++)
{
var language = _repository.GetLanguage(vm.Languages[i].Id); //This is the key, get the original program object to update
UpdateModel(language, "Languages[" + i + "]");
}
_repository.Save();
int id = Int32.Parse(collection["HiddenId"]);
Language languageToDelete = _repository.GetLanguage(id);
_repository.Delete(languageToDelete);
vm.Languages.Remove(vm.Languages.SingleOrDefault(l => l.Id == id));
_repository.Save();
return PartialView("LanguageList", vm);
}
但是我已经改变了返回一个PartialView(这是我应该从一开始就做的,因为那是jQuery的作用 - 用结果加载一个div)。但问题是,在从Action方法返回此部分视图并使用jQuery将其加载到div中后,$(“。delete”)。单击jQuery函数不再起作用...
任何想法为什么?
答案 0 :(得分:3)
您可以尝试在表单中包含一个隐藏字段,该字段将包含id:
<input type="hidden" name="id" id="hiddenid" value="" />
然后:
$('.delete').click(function () {
var id = $(this).closest('tr').find('td:first').text();
$('#hiddenid').val(id);
$.ajax({
type: 'POST',
url: deleteurl,
data: $('form').serialize(),
cache: false,
success: function (html) {
$('#rows').html(html);
}
});
return false;
});
可以简化为:
$('.delete').click(function () {
var id = $(this).closest('tr').find('td:first').text();
$('#hiddenid').val(id);
$('#rows').load(deleteurl, $('form').serialize());
return false;
});
答案 1 :(得分:1)
您是否尝试在发布之前将id附加到deleteurl?
这样的事情对我有用:
deleturl = deleteurl + "/" + id;
HTH,
\ ^ /我l
答案 2 :(得分:0)
如何将FormCollection作为第二个参数而不是viewmodel传递。然后,您可以在保存和/或删除之前对语言对象执行TryUpdateModel。