2011-03-23 48 views
0

我试图做在MVC应用程序使用jQuery后,根据这个苏答案在这里: Can jQuery do a POST of a ViewModel to a Controller in ASP.NET MVC?传递ViewModel与jQuery后?

的区别是我使用它在动态视图中删除一个项目(心中永远的事实我直接发布删除,这是一个通过授权的封闭网站,我将使用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方法中移除int id参数,它实际上会到达那里,但是vm = null。我不知道该怎么做,所以任何帮助将不胜感激!

编辑: 对不起,返回值应该现在改变,不返回视图()。

UPDATE:

与达林它一点点的帮助几乎可以工作:

[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)。但问题是,从动作方法返回此部分视图并将其加载到div与jQuery后,$(“。delete”)。单击jQuery功能不再工作了...

任何想法为什么?

回答

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; 
}); 
+0

好吧,但是如何在action方法中同时获得id和ViewModel呢?在你的例子中,action方法中的参数应该达到这两个参数? – Anders 2011-03-23 18:03:04

+0

@Anders Svensson,你不需要修改你的动作方法签名。使用此代码,您应该同时在操作中绑定id和视图模型。只要确保在视图模型上没有名为id的属性,或者您可能会得到奇怪的结果。 – 2011-03-23 18:03:55

+0

好吧,我尽量按照你的说法尝试,但它仍然没有达到操作方法,并且只通过发送表单作为参数,在这种情况下签名不会错误吗?而且我仍然不明白该方法是如何访问该ID的,因为我将它放在了hiddenid输入中? – Anders 2011-03-23 18:13:16

1

你有没有尝试在发布之前将id追加到deleteurl?

像这样的东西为我工作:

deleturl = deleteurl + "/" + id; 

心连心,

\ ^/-111

+0

我还没有尝试过,但我可以放弃它,但我似乎记得,如果你在ajax方法中有一个数据参数,它将覆盖url中的参数或其他东西,我不确定。但我会检查! – Anders 2011-03-23 17:59:32

+0

那么,正如我怀疑,它没有工作... – Anders 2011-03-23 19:33:15

0

如何传递的FormCollection作为第二个参数,而不是视图模型。然后,您可以在保存和/或删除之前在您的语言对象上执行TryUpdateModel。

+0

我不认为这会帮助我害怕,我需要在这里传递ViewModel。视图的动态方面(在同一个视图中编辑,添加和删除)需要不同的更新代码(我试图在这个论坛中找到几周的简单方法...) – Anders 2011-03-23 17:58:21