2013-10-28 2 views
0

이것은 잘 착용 된 주제이지만 분명히 이전 게시물을 열람 할 수있는 솔루션을 찾지 못했습니다. 누군가 그것을 바라는 것은 내가 그것을 많이해야하기 때문에 이것을 "올바른 방법"이라고 말할 수 있습니다.Model.State가 유효하지 않은 경우 Ajax.Beginform post validation이 OnSuccess 함수를 트리거합니다.

주요 문제 : Ajax.Beginform이 게시 된 ModelState가 유효하지 않은 경우에도 OnSuccess 메소드가 계속 트리거됩니다. 나는 이것이 올바른 행동이라는 것을 알고 있지만, OnSuccess 방법은 게시물이 "성공"했을 때에 만 의미있는 일을합니다.

이 경우 유효성 검사 오류가있는 재 표시 양식을 가장 효과적으로 관리하는 방법은 무엇입니까? 내 컨트롤러에서 성공 표시 = false를 다시 표시하려면 어떻게해야합니까?

질문과 관련이 없지만 내가 여기서하고있는 일은 내가 포기한 부트 스트랩 모달에 양식을 표시하려고하는 것과 다소 유사합니다.

1) 컨트롤러를 ajax를 통해 호출하여 div에 양식을로드합니다.

$(function addpaneevent() { 
    $('.addpane').on("click", function() { 
     var url = '/QuizPane/QuickPane?quizId=' + $(this).data("quizid"); 
     $.ajax({ 
      url: url, 
      type: 'GET', 
      contentType: 'application/json', 
      success: function (result) { 
       $('#overlay').html(result); 
      }, 
      error: function (result) { 
       console.log("bummer",result); 
      } 
     }); 
    }); 
}); 

2) 성공 나는 테이블에 새 레코드를 추가 및 제거하고 있습니다에 전화 후

[HttpPost] 
public ActionResult QuickPane(QuizPane quizpane) 
{ 
    if (ModelState.IsValid) 
    { 
     db.QuizPanes.Add(quizpane); 
     db.SaveChanges(); 
     return PartialView("_quizpanelist", quizpane); 
    } 
    return View(quizpane); //tried a few different things here 
} 

4) 제출에 부분도 포함하는 형태

public ActionResult QuickPane(int quizId) 
{ 
    var model = *querytogetmodel* 
    return PartialView("QuickPane",model); 
} 


@using (Ajax.BeginForm("QuickPane", "QuizPane", FormMethod.Post, 
    new AjaxOptions 
    { 
          InsertionMode = InsertionMode.Replace, 
          HttpMethod = "POST", 
          OnSuccess = "updatePaneList(data)", 
          OnFailure = "massivefail(data)", 
    })) 
{ 
    @Html.ValidationSummary(true) 

    <fieldset> 
     @Html.HiddenFor(model => model.QuizID) 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Title) 
     </div> 
     <div class="editor-field"> 
      @Html.TextBoxFor(model => model.Title, new { @autofocus = "autofocus" }) 
      @Html.ValidationMessageFor(model => model.Title) 
     </div> 
     ...more of the same 
     <input type="submit" value="Create" class="btn btn-primary"/> 
    </fieldset> 
} 

3)을 반환 div 입력 양식을 포함합니다.

답변

0

Ajax.BeginForm을 사용하는 대신 일반 양식을 사용하고 Ajax 호출을 사용합니다.

$(document).on('click', '.btn-primary', function(){ 
    $.ajax({ 
     url: '@Url.Action('QuickPane', 'QuizPane')', 
     type: 'post', 
     data: { 
      Title: $('#Title').val() 
     } 
     success: function(result){ 
      //Do Something 
     } 
     error: function(result){ 
      //Display error 
     } 
    }); 
}); 

은 다음과 컨트롤러 반환 JSON 대신 부분보기에 당신이 도움이 희망이 ExtJS: how to return json success w/ data using asp.net mvc 등이 return Json error from ASP.NET MVC 또는 성공과 같은 오류를 설정할 수 있습니다.

+0

, 나는 모든 모델 검증의 장점과 첨부 된 메시지를 손실하지 않습니다 필드 등? 왜 모든 일이 그렇게 힘들어 야합니까? :) – Joel

+0

부분 뷰에 표시 할 유효성 검사를 성공적으로 수행하는 유일한 방법은 전체 뷰로 변경하여 iframe에 표시하는 것입니다. 이 메서드를 사용하여 클라이언트 측 jquery 유효성 검사를 수행하고 수동으로 서버 측 유효성 검사를 수행하고 오류를 통해 결과를 보낼 수 있지만 좀 더 작업 할 수 있습니다. 이것은 나에게도 까다로운 시나리오였습니다. –

+0

실제로 제가 돌아 오는 뷰를하고 있기 때문에 약간 질문을 편집했습니다. View (quizpane); PartialView 대신. UpdateTargetId = "overlay"를 Ajax.BeginForm에 추가하면 ModelState.IsValid == false 일 때 유효성 검사가 올바르게 수행됩니다. 그러나 ModelState.IsValid == true로 설정하면 OnSuccess 메서드를 호출하지 않으므로 실패합니다. 원하지 않는 #overlay에 결과를 삽입합니다. UpdateTargetId = "overlay"를 제거하면 ModelState.IsValid == true 일 때 제대로 작동하지만 Form에 유효성 검사 오류가 없기 때문에 ModelState.IsValid == false 일 때 실패합니다. 지 버스! – Joel

3

나는 이것을 해결하기위한 제안 된 방법인지는 모르겠지만 다음을 수행하여 해결했습니다. 또한 두 경우 모두 부분 뷰를 반환해야합니다.

부분보기 OnFailureOnSuccess 어떤 식 으로든 ModeState.IsValid에 매여되지 않기 때문이다

function doOnSuccess(data, status, xhr) { 
    if (xhr.getResponseHeader('X-Error')) { 
     //validation error occurred 
    } 
    else 
    { 
     //validation error did not occur 
    } 
} 
+0

Ryan, 방금이 반응을 보았습니다. 사과드립니다. 나는 당신이 제안한 것과 똑같은 맥락에서 뭔가 다른 일을 끝내었다. 유효성 검사에 실패하면 같은 양식이 유효성 검사 오류와 함께 표시됩니다. 게시물이 성공하면 나는 succes view를 얻는다. 그래서, 자바 스크립트 성공 함수에서 나는 을 추가했다. (data.indexOf ("form action =") === -1) {// success stuff} else { // 양식을 다시 표시 } – Joel

0

onsuccess는 자바 스크립트에 다음 줄을 다음

Response.AppendHeader("X-Error", "true") 

를 추가 반환하기 전에. AjaxOptions docs

:

OnSuccess

: 응답 상태 는 200 내지 경우이 함수를 호출한다.
OnFailure : 응답 범위 이 200 범위의이 아닌 경우이 함수가 호출됩니다.즉

, 당신은 수동으로 Response.StatusCode을 변경하여 ActionResult를 반환하고 당신이 당신의 OnFailure JS 방법에 기대하고 값 어떤 반환 할 때 오류가 있다고 지정해야합니다.

[HttpPost] 
public ActionResult Search(Person model) 
{ 
    if (ModelState.IsValid) { 
    // if valid, return a HTML view inserted by AJAX helper 
    var results = PersonRepository.Get(model) 
    return PartialView("Resulsts", vm); 

    } else { 
    // if invalid, return a JSON object and handle with OnFailure method 
    Response.StatusCode = (int)HttpStatusCode.BadRequest; 
    return Json(new { errors = ModelState.Values.SelectMany(v => v.Errors) }); 

    } 
} 

더 읽을 : 필요에 대한 그 시나리오에서

관련 문제