Получить HttpContext из JQuery AJAX GET
-
20-09-2019 - |
Вопрос
Мой проект использует Castle Monorail в качестве структуры MVC.Проблема в том, что Monorail требует, чтобы все контроллеры имели шаблон представления.Я пытаюсь получить строку обратно из метода контроллера через вызов AJAX.AJAX GET всегда возвращает с сервера ошибку 500, поскольку Monorail не может найти шаблон представления.Я видел другие примеры обходных путей, в которых вы просто устанавливаете тип возвращаемого значения метода контроллера как void (это сигнализирует монорельсу о том, что не нужно искать контроллер представления), а затем делаете что-то вроде:
Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
Чтобы просто записать контекст на экран.
Итак, у меня есть метод Follow, и я пытаюсь получить возвращаемую строку через 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?
Решение
Все производные контроллеры монорельсовой дороги имеют доступ к методу 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;
}
Таким образом, код начинается с защитных мер (предварительных условий), а последний оператор возврата в методе представляет собой нормальное завершение выполнения.ИМХО, это облегчает чтение.