Pregunta

Mi proyecto es el uso de Castillo monorraíl como marco MVC. El problema es que monorraíl requiere que todos los controladores tienen una plantilla de vista. Estoy tratando de obtener una cadena de regresar de un método en un controlador a través de una llamada AJAX. El GET AJAX siempre devuelve un error 500 del servidor porque monorraíl no puede encontrar una plantilla de vista. He visto otros ejemplos de soluciones en las que se acaba de establecer el tipo de retorno del método controlador de anular (esto indica monorraíl para no molestar la búsqueda de un controlador de vista) y luego hacer algo como:

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

Para escribir sólo el contexto de la pantalla.

Así que tengo el método de seguimiento y estoy tratando de obtener la cadena de retorno a través de un AJAX jQuery GET. Alguien puede ayudar?

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

¿Cómo debo tomar este retorno vacío y leer los valores de retorno a través de la HttpContext?

¿Fue útil?

Solución

Todos los controladores Monorail derivados tienen acceso a un método llamado "CancelView ()". Ejecutar este método en el método que desea volver sin necesidad de utilizar una plantilla de vista.

Otros consejos

Puede utilizar el JsonReturnBinder de que:

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

El refinamiento sugerencia:

¿Por qué devolver el código de estado como parte del cuerpo de la respuesta? existe el campo HttpStatusCode en cualquier respuesta. Si se establece en el código deseado hará que el código del cliente más fácil de usar (se puede inspeccionar el código de estado en el XMLHttpRequest directamente, y la mayoría de las bibliotecas JS ha dedicado manipuladores para el éxito y errores), además de su método devuelve la cadena deseada, por lo que las pruebas unitarias sería mucho más fácil. Ejemplo:

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

Otra sugerencia - baraja el if / else bloques para reducir los niveles de anidación:

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

De esta manera el código comienza con salvaguardias (precondiciones), y la última instrucción de retorno en el método representa la terminación normal ejecución. OMI que hace las cosas más fáciles de leer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top