JQuery AJAX에서 HttpContext 가져오기 GET
-
20-09-2019 - |
문제
내 프로젝트에서는 Castle Monorail을 MVC 프레임워크로 사용하고 있습니다.문제는 모노레일이 모든 컨트롤러에 뷰 템플릿이 있어야 한다는 것입니다.AJAX 호출을 통해 컨트롤러의 메서드에서 문자열을 다시 가져오려고 합니다.Monorail이 뷰 템플릿을 찾을 수 없기 때문에 AJAX GET은 항상 서버에서 500 오류를 반환합니다.컨트롤러 메서드의 반환 유형을 void로 설정한 다음(이것은 뷰 컨트롤러를 찾는 데 방해가 되지 않도록 모노레일에 신호를 보냅니다) 다음과 같은 작업을 수행하는 해결 방법의 다른 예를 보았습니다.
Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
화면에 컨텍스트를 작성하기만 하면 됩니다.
그래서 나는 다음 방법을 가지고 있으며 Jquery AJAX GET을 통해 반환 문자열을 얻으려고합니다.누군가 도와줄 수 있나요?
public void Note(string id)
{
if (!string.IsNullOrEmpty(id))
{
if (notesProvider.HasNote(id))
{
return "{status:'200', text: '" + notesProvider.GetNote(id).Body + "'}";
}
else return "{status:'404', text: 'Could not find the Note by provided id [" + id + "]'}";
}
else return "{status:'500', text: 'Illegal request : a note id must be provided'}";
}
}
이 반환을 무효화하고 HTTPCOntext를 통해 반환 값을 읽으려면 어떻게 해야 합니까?
해결책
모든 파생 된 Monorail 컨트롤러는 "CancelView ()"이라는 메소드에 액세스 할 수 있습니다. 보기 템플릿을 사용하지 않고 반환하려는 메소드 내 에서이 메소드를 실행하십시오.
다른 팁
이를 위해 JsonReturnBinder를 사용할 수 있습니다.
[return:JSonReturnBinder]
public object Note(string id)
{
if (!string.IsNullOrEmpty(id))
{
if (notesProvider.HasNote(id))
{
return new {status=200, text= notesProvider.GetNote(id).Body };
}
else return new {status=404, text="Could not find the Note by provided id [" + id + "]" };
}
else return new {status =500, text="Illegal request : a note id must be provided" };
}
개선 제안:
응답 본문의 일부로 상태 코드를 반환하는 이유는 무엇입니까?모든 응답에는 HttpStatusCode 필드가 있습니다.원하는 코드로 설정하면 클라이언트 코드를 더 쉽게 사용할 수 있고(XMLHttpRequest에서 상태 코드를 직접 검사할 수 있으며 대부분의 JS 라이브러리에는 성공 및 오류에 대한 전용 핸들러가 있음), 메서드가 원하는 문자열을 반환하므로 단위 테스트 훨씬 쉬울 것입니다.예:
[return:JSonReturnBinder]
public string Note(string id)
{
if (!string.IsNullOrEmpty(id))
{
if (notesProvider.HasNote(id))
{
return notesProvider.GetNote(id).Body;
}
else
{
Response.StatusCode = 404;
return "Could not find the Note by provided id [" + id + "]";
}
}
else
{
Response.StatusCode = 500;
return "Illegal request : a note id must be provided";
}
}
또 다른 제안 - 중첩 수준을 줄이기 위해 if/else 블록을 섞습니다.
[return:JSonReturnBinder]
public string Note(string id)
{
if (string.IsNullOrEmpty(id))
{
Response.StatusCode = 500;
return "Illegal request : a note id must be provided";
}
if (notesProvider.HasNote(id) == false)
{
Response.StatusCode = 404;
return "Could not find the Note by provided id [" + id + "]";
}
return notesProvider.GetNote(id).Body;
}
이런 식으로 코드는 보호 장치(사전 조건)로 시작하고 메서드의 마지막 return 문은 정상적인 실행 완료를 나타냅니다.IMO를 사용하면 읽기가 더 쉬워집니다.