문제

내 프로젝트에서는 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를 사용하면 읽기가 더 쉬워집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top