2011-03-23 80 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

相關問題