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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top