使用jQuery帖子传递ViewModel?

时间:2011-03-23 17:02:57

标签: jquery asp.net asp.net-mvc-3 viewmodel

我正在尝试在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函数不再起作用...

任何想法为什么?

3 个答案:

答案 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。