2013-03-30 2 views
1

MVC 4를 사용 중이고 게시 요청을 보내려고하고 있으며 HTML에서 결과보기로 컨트롤러에서 성공적인 반환을 얻지 만, 그 시점에서 무엇을해야할지 모르겠습니다.AJAX POST MVC 4의 반환을 올바르게 렌더링하는 방법

JS

$("form").submit(function (e) { 
    e.preventDefault(); 
    if ($(this).valid()) { 
     $.ajax({ 
      url: submitUrl, type: "POST", traditional: true, 
      data: { EventName: 'Name of event'}, 
      success: function(data){ 
       $("#content").html(data); 
      } 
     }) 
    } 
}); 

내 컨트롤러

[HttpPost] 
public ActionResult CreateEvent(EventModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     return RedirectToAction("Index"); 
    } 
    else 
    { 
     return View(model); 
    } 
} 

그래서 내 컨트롤러가보기 또는 RedirectToAction을 반환하거나 볼 수 있습니다. 내 아약스 호출의 성공 콜백에서 다음을 수행하고있다 : $ ("# content") .html (data); 하지만 아무 일도 없을 것 같습니다. 누군가가 컨트롤러 동작의 반환을 제대로 처리하는 올바른 방향으로 나를 밀어 넣을 수 있습니까?

정말 고마워요!

+0

JSON 예제를 반환해야합니다. "성공"의 { "me": "ok"}는 메시지를 구문 분석하고 표시해야합니다. –

+0

당신은 서버 측에서하고있는 것처럼 리다이렉트를 위해 자바 스크립트의 Window.location을 사용할 수 있습니다. 클라이언트에게 성공 플래그를 돌려주고 경로를 선택하게하십시오 – Devesh

+0

안녕하세요, 존, 죄송 합니다만, 진술을 이해하지 못했습니다. 내 컨트롤러에서 Json (View (model))을 반환하고 Javascript를 그대로 두어야합니까? 감사. – mvcNewbie

답변

4

제대로 이해하면 페이지에 이벤트 만들기 양식이 있고 새 이벤트를 만들기 위해 AJAX 요청을 보내려합니다. 그런 다음 페이지 #content의 섹션을 CreateEvent 조치의 결과로 대체하려고합니다.

AJAX가 올바르게 설정되어있어 CreateEvent이 성공적으로 응답하는 것으로 보입니다. 나는 당신이 지금 그 반응에 대해 혼란스러워하고 있다고 생각합니다. 몇 가지 옵션이 있지만 두 가지를 선택합시다.

JSON 응답

[HttpPost] 
public ActionResult CreateEvent(EventModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     var event = service.CreateEvent(model); // however you create an event 
     return Json(event); 
    } 
    else 
    { 
     // model is not valid so return to original form 
     return View("Index", model); 
    } 
    ... 

은 이제 JSON에서 HTML 태그를 생성하고 #content에 삽입해야합니다.

$.ajax({ 
    url: submitUrl, type: "POST", traditional: true, 
    data: { EventName: 'Name of event'}, 
    success: function(data){ 
     var obj = JSON.Parse(data); 
     var html; // build html with the obj containing server result 
     $("#content").html(html); 
    } 
}) 

또는 HTML 조각 대신에 우리가 Layout 모든 headscript 태그없이 단지 PartialView을 돌아갑니다 정의 Layout로 전체 페이지를 반환

.

[HttpPost] 
public ActionResult CreateEvent(EventModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     var event = service.CreateEvent(model); // however you create an event 
     return PartialView("CreateEventResult", event); 
    } 
    else 
    { 
     // model is not valid so return to original form 
     return View("Index", model); 
    } 
} 

지금 새로운 부분보기 CreateEventResult.cshtml (면도기)

@model Namespace.EventModelResult 
@ { 
    Layout = null; 
} 
<div> 
    <!-- this stuff inserted into #content --> 
    @Model.Date 
    ... 
</div> 

을하고 자바 스크립트

$.ajax({ 
    url: submitUrl, type: "POST", traditional: true, 
    data: { EventName: 'Name of event'}, 
    success: function(data){ 
     $("#content").html(data); 
    } 
}) 

편집 변경되지 않습니다 :이 이벤트 작성에 실패 경우 입력을 확인한 후에 어떤 이유로 든 너는 응답하고 싶다. 한 가지 옵션은 반환 한 객체에 응답 상태를 추가하고 새로 만든 Event 대신 해당 상태를 표시하는 것입니다.

+0

Jasen, 매우 도움이되는 고장에 감사드립니다. 당신이 올바른 길을 가고 있기 때문에 몇 가지 질문이 있습니다. MVC가 방금 발생하는 작업 결과를 처리하는 방법에서 전환하려고합니다. 즉, 모델 작성이 성공하면 새 링크 (컨트롤러의 색인으로 사용자 보내기) 또는 유효성 검증 오류가 포함 된 모델을 리턴합니다. 당신의 예에서 나는 내가 기대하는 것을 알 필요가 있습니다. 두 가지 모두를 처리 할 수있는 방법이 있습니까? 아니면 AJAX가 모델을 게시하는 방식과 관련하여이 모든 문제를 생각하고 있습니까? 다시 한 번 감사드립니다! – mvcNewbie

+0

AJAX를 사용하여 CreateEvent를 처리하므로 원본 페이지를 떠나지 않으므로 결과 만 반환합니다. [PRG] (http://en.wikipedia.org/wiki/Post/Redirect/Get)를 시도하고 있습니까? – Jasen

+0

Jasen, 네, 그게 내가하려는 일입니다. 면도기 코드를 어떻게 든 활용하려고 했으므로 아약스 호출이 반환 될 때 페이지/리디렉션/새로 고침을 처리하기 위해 동일한 코드를 사용할 수있었습니다. 나는 이것이 AJAX 호출을 수행 할 수 없다는 것을 알았고 페이지를 다시로드 할 필요가 없기 때문에 사실상 더 좋을 수도 있지만 이제는 html을 새로운 json 객체로 바꿀 수 있기 때문에 스스로 새로 고침해야한다. 서버에서. 귀하의 의견을 보내 주셔서 감사합니다. – mvcNewbie

관련 문제