2011-03-23 1 views
0

나는에 따른, MVC 응용 프로그램에서 jQuery로 게시물을 할 노력하고있어이 그래서 여기에 답 Can jQuery do a POST of a ViewModel to a Controller in ASP.NET MVC?jQuery 게시물이있는 ViewModel을 전달 하시겠습니까?

차이가 나는 (사실을 신경 쓰지 동적 뷰에서 항목을 삭제하는 데 사용하고있다

내가 직접 삭제를 게시하고, 이것은 승인에 의해 닫힌 사이트이며, 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(); 
     } 

다시, 작동하지 않는, 심지어는 디버거의 동작 방법에 도착하지 않습니다. 액션 메소드에서 int id 매개 변수를 제거하면 실제로 거기에 도착하지만 vm = null이됩니다. 나는 무엇을해야할지 아무런 단서가 없으므로 어떤 도움이라도 대단히 감사하겠습니다!

편집 : 죄송합니다. 반환 값은 현재 변경된 상태 여야하며 View()를 반환하지 않아야합니다.

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를로드). 하지만이 부분 뷰를 작업 메서드에서 반환하고 jQuery로 div에로드 한 후 $ (". 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); 
    $('#rows').load(deleteurl, $('form').serialize()); 
    return false; 
}); 
+0

하지만 어떻게 동작 방법에서 id와 ViewModel을 모두 얻을 수 있습니까? 액션 메소드의 매개 변수가이 두 가지를 모두 얻으려면 어떻게해야합니까? – Anders

+0

@Anders Svensson, 당신은 당신의 행동 방식 서명을 수정할 필요가 없습니다. 이 코드를 사용하면 액션에 바인딩 된 ID와 뷰 모델을 모두 가져와야합니다. 보기 모델에 ID라는 속성이 없으면 이상한 결과가 발생할 수 있습니다. –

+0

그래, 내가 말한대로 정확하게 시도했지만, 여전히 액션 메소드에 도달하지 못했고, 매개 변수로만 폼을 보내면이 경우 서명이 잘못되지 않겠는가? 그리고 나는 숨겨진 입력에 넣었 기 때문에이 메소드가 이드에 어떻게 액세스 할 수 있는지 이해하지 못한다. – Anders

1

: 단순화 할 수

$('.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; 
}); 

게시하기 전에 deleteurl에 ID를 추가하려고 했습니까? 이 같은

무언가가 나를 위해 일했습니다

deleturl = deleteurl + "/" + id; 

HTH,

\ ^/I 리터 리터

+0

나는 그것을 시도하지는 않았지만 나는 그것을 줄 수 있었다. 그러나 당신이 ajax 메서드에 데이터 매개 변수를 가지고 있다면 URL이나 뭔가의 매개 변수를 오버라이드한다는 것을 나는 기억하고있는 것처럼 보인다. 그러나 나는 점검 할 것이다! – Anders

+0

글쎄, 내가 의심, 그게 작동하지 않았다 ... – Anders

0

방법 대신 뷰 모델의 두 번째 인수로 FormCollection를 전달하는 방법에 대한. 그런 다음 저장 및/또는 삭제하기 전에 언어 개체에서 TryUpdateModel을 수행 할 수 있습니다.

+0

나는 그것이 두려워 도움이 될 것 같지 않아요, 나는 ViewModel이 여기에 전달해야합니다. 보기의 동적 측면 (동일한보기에서 편집, 추가 및 삭제)에는 다른 업데이트 코드가 필요합니다 (이 포럼에서는 몇 주 동안 더 간단한 방법을 찾으려고했습니다 ...) – Anders