2009-08-31 3 views
0

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

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'}"; 
    } 
} 

Как я могу сделать это return void и прочитать возвращаемые значения через HTTPCOntext?

ответ

1

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

0

Вы можете использовать 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" }; 
} 

Refinement предложение:

Почему вернуть код состояния как часть тела ответа? в любом ответе есть поле 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"; 
    } 
} 

Еще одно предложение - перетасовать если/иначе блоки для снижения уровней вложенности:

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

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