Obtenha HttpContext do JQuery Ajax Get
-
20-09-2019 - |
Pergunta
Meu projeto está usando o monotrilho do castelo como uma estrutura de MVC. O problema é que o monotrilho exige que todos os controladores tenham um modelo de visualização. Estou tentando obter uma string de volta de um método em um controlador por meio de uma chamada AJAX. O Ajax recebe sempre um erro 500 do servidor porque o monotrilho não consegue encontrar um modelo de exibição. Vi outros exemplos de soluções alternativas nas quais você acabou de definir o tipo de retorno do método do controlador para anular (esse sinaliza monotrilho para não se preocupar em encontrar um controlador de visualização) e depois fazer algo como:
Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
Apenas escrever o contexto na tela.
Então, eu tenho o método a seguir e estou tentando obter a string de retorno por meio de um JQuery Ajax Get. Alguém pode ajudar?
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'}";
}
}
Como devo fazer esse retorno vazio e ler os valores de retorno através do httpContext?
Solução
Todos os controladores monotrilhos derivados têm acesso a um método chamado "CancelView ()". Execute esse método no método que você deseja retornar sem usar um modelo de exibição.
Outras dicas
Você pode usar o JSONRETURNBINDER para isso:
[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" };
}
Sugestão de refinamento:
Por que devolver o código de status como parte do corpo de resposta? Existe o campo Httpstatuscode em qualquer resposta. Configuração para o código desejado facilitará o uso do código do cliente (você pode inspecionar o código de status na XMLHTTPREQUEST diretamente, e a maioria das bibliotecas JS possui manipuladores dedicados para sucesso e erros), além de seu método retornará a sequência desejada, portanto, o teste de unidade seria muito mais fácil. Exemplo:
[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";
}
}
Outra sugestão - embaralhar os bloqueios IF/else para reduzir os níveis de nidificação:
[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;
}
Dessa forma, o código começa com salvaguardas (pré-condições) e a última declaração de retorno no método representa a conclusão normal de execução. IMO, facilita a leitura das coisas.