Получить HttpContext от JQuery AJAX GET - PullRequest
       18

Получить HttpContext от JQuery AJAX GET

0 голосов
/ 31 августа 2009

Мой проект использует Castle Monorail в качестве основы MVC. Проблема в том, что Monorail требует, чтобы все контроллеры имели шаблон представления. Я пытаюсь получить строку обратно из метода на контроллере через вызов AJAX. AJAX GET всегда возвращает ошибку 500 с сервера, потому что Monorail не может найти шаблон представления. Я видел другие примеры обходных путей, в которых вы просто устанавливаете тип возврата метода контроллера как void (это сигнализирует монорельс, чтобы не беспокоить поиск контроллера представления), а затем выполняете что-то вроде:

Context.Response.OutputStream.Write(buffer, 0, buffer.Length);

Чтобы просто записать контекст на экран.

Итак, у меня есть следующий метод, и я пытаюсь получить возвращаемую строку через JQery 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?

Ответы [ 2 ]

1 голос
/ 31 августа 2009

Все производные монорельсовые контроллеры имеют доступ к методу, называемому «CancelView ()». Выполните этот метод в методе, который вы хотите вернуть без использования шаблона представления.

0 голосов
/ 02 сентября 2009

Вы можете использовать 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 имеют выделенные обработчики для успеха и ошибок), плюс ваш метод вернет нужную строку, поэтому Unit Testing было бы намного проще. Пример:

[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;
}

Таким образом, код начинается с гарантий (предварительных условий), а последний оператор возврата в методе представляет завершение нормального выполнения. ИМО облегчает чтение.

...