2013-06-25 3 views
1

ASP.NET MVC 4 프로젝트에서 일부 오류를 처리하고 싶습니다. 이전에 WebForms 응용 프로그램을 개발 중이었고 Page.ClientScript.RegisterClientScriptBlock을 사용했지만 MVC! = WebForms에 서버 컨트롤, 포스트 백 등을 사용했습니다 ... 그래서 약간 혼란 스럽습니다.ASP.NET MVC 4 컨트롤러에서 자바 스크립트 호출을 내 보냅니다. 면도기

물론 컨트롤러에서 return Json(...)과 같은 smth를 사용하여 JSON 응답을 반환 할 수는 있지만 기다려야합니다.

보기가 있습니다. 정확한 마크 업이 있습니다. 내 뷰는 내 jQuery + bootstap 코드에서 호출해야하는 modalbox를 어떻게 인식합니까?

우선, 나는 쿼리 문자열을 처리하기 위해 GET 매개 변수를 사용하려고 생각했습니다.

하면/색인/UserNotExist ->보다 그렇지

사용자 정의 modalbox

을 보여주는 JQuery와 함수를 호출 할 경우, 다른 일부 URL -> 같은 modalbox을 보여주는 JQuery와 함수를 호출보다,하지만 다른 텍스트.

현재 위치를 처리하기 위해 일부 코드를 사용해 보았지만 실패 (이상한 점은 일부 스크립트 블록이 일부 jQuery 스크립트가 제대로 실행되고 있지만 그 스크립트는 실행되지 않았 음).

그런 다음 쿠키에 임시 데이터를 쓰고 간단한 확인을 할 생각입니다.

그러나 WebForms에서 코드 if (Request.Cookies["error"] != null의 검사가 잘 실행되고있는 경우 MVC는 항상 예외를 확인하는 검사를받지 않습니다.

나는 조금 피곤해서 당신의 제안을 듣고 싶습니다.

내가 뭘 잘못하고 있니?

덕분에 내가 제대로 이해하면

+0

클라이언트에서 서버 측 오류를 노출하는 방법을 찾고 있습니까? 미안하지만, 내가 필요한 것을 여기서 따르지 않을거야. –

+0

@RacielR. 그래, 당신 말이 맞아요, 자바 스크립트가 컨트롤러의 끝점에서 결과를 얻는 클라이언트 측에서 정확하게 오류 검사가 필요합니다. 하지만 난 내 문제를 정확하게 이해하기 위해 설명했다 : ( –

답변

2

서버에서 클라이언트로 오류를 가져 오는 방법 - 컨트롤러의 동작을 사용하기 위해 아약스를 사용하지 않을 때 - TempData을 사용합니다.

나는 보통 모든 컨트롤러에 공통적 인 다른 배관을 더한베이스 컨트롤러를 가지고 있습니다. 그래서

,이 방법

protected void AddError(string message, string header = null) 
    { 
     TempData[Constants.ErrorKey] = new ViewMessage 
     { 
      Type = eMessageType.Error, 
      Header = header, 
      Content = message 
     }; 
    } 

은 TempData에 오류 메시지를 추가합니다.

내 _Layout에 있습니다.cshtml 나는 부트 스트랩의 경고를 사용하여 오류를 표시하는 섹션이 : 그래서 언제 어떤 컨트롤러에서 작업을 호출

@if (TempData[Constants.ErrorKey] != null) 
{    
    var error = TempData[Constants.ErrorKey] as ViewMessage; 
    <div class="alert alert-block alert-error fade in"> 
     <a class="close" data-dismiss="alert" href="#">&times;</a> 
     <br /> 
     <h4 class="alert-heading">@error.Header:</h4> 
     <p>@error.Content</p> 
     <br /> 
    </div> 
    <br /> 
} 

는 비즈니스 로직 오류가 발생, 오류 내용 경고가있다.

실제로 처리되지 않은 예외에 대해 작업 필터를 결합 할 수 있으며 필요에 따라 정교하게 처리 할 수 ​​있지만 이는 기본적인 아이디어입니다.

물론 세션을 사용할 수도 있지만 사용 후에 값이 삭제되므로 TempData가 더 적합합니다.

반면에 ajax를 사용하여 작업과 상호 작용하는 경우 순수한 클라이언트 측 스크립팅 및 DOM 조작입니다.

0

... 그래서 기본적으로

public class UserController : Controller 
{ 
    public ActionResult GetUser(int userId) 
    { 
     var user = // Get user by user id. 
     if (user == null) 
      return null; 
     else 
     { 
      var serializer = new JavaScriptSerializer(); 
      return Json (new {user = serializer.Serialize(user)}); 
     } 
    } 
} 

public class ModalViewController : Controller 
{ 
    public ActionResult Index(string message) 
    { 
     ViewBag.Message = message; 
     return PartialView("ModalView"); 
    } 
} 

var actionUrl = '/User/GetUser'; 
var data = { "userId": userId }; 

$.ajax({ 
    url: actionUrl, 
    type: "POST", 
    dataType: "json", 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(data), 
    success: function (user) { 
      ShowModalView(user == null || user.length <= 0); 
     }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     alert(eval("(" + jqXHR.responseText + ")")); 
    }); 

function ShowModalView(userExists) { 
var actionUrl = '/ModalView/Index'; 
var data = { "message": userExists ? "hi there user" : "oops, no user found" }; 

$.ajax({ 
    url: actionUrl, 
    type: "POST", 
    dataType: "html", 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(data), 
    success: function (modalView) { 
     $('#detailsDiv').replaceWith(modalView); 
     }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     alert(eval("(" + jqXHR.responseText + ")")); 
    }); 
} 

, 먼저 사용자가 존재하는지 확인하는 작업 방법에 아약스 전화를하고 또 다른 아약스 전화를 걸 모달 뷰의 부분 뷰를 반환합니다. 모달 뷰는 ViewBag에서 메시지를 가져오고 두 번째 아약스 호출의 success 콜백 메소드에서는 기본 뷰에서 원하는 부분 뷰를 렌더링 할 수 있습니다.

+0

아니, 내가 무엇을 필요로하는지 이해하지 못했지만주의를 기울였다. –

+0

어때? ShowModalView()는 ModalViewController에 또 다른 ajax 호출을하여 보여줄 것이다. 올바른 메시지가있는보기. – tranceporter

관련 문제