Frage

Ihr Projekt verwendet Castle Einschienen als MVC-Framework. Das Problem ist, dass Einschienen erfordert, dass alle Controller eine Ansichtsvorlage haben. Ich versuche, auf einem Controller über einen AJAX-Aufruf einen String zurück von einem Verfahren zu erhalten. Die AJAX GET gibt immer einen 500-Fehler von dem Server, weil Einschienen keine Ansichtsvorlage finden. Ich habe andere Beispiele von Abhilfen zu sehen, in dem Sie nur den Rückgabetyp der Controllers Methode ungültig gesetzt (diese Signale Einschienenbahn nicht stören einen View-Controller zu finden) und dann etwas zu tun, wie:

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

So schreiben Sie einfach den Kontext auf den Bildschirm.

So habe ich die folgen Methode und ich versuche, die Rückkehr String über eine JQuery AJAX GET zu bekommen. Kann jemand helfen?

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

Wie soll ich machen diese Rückkehr ungültig und lesen Sie die Rückgabewerte über die Httpcontext?

War es hilfreich?

Lösung

Alle abgeleitet Einschienen Controller haben Zugriff auf ein Verfahren namens „CancelView ()“. Führen Sie dieses Verfahren innerhalb der Methode, dass Sie ohne Verwendung einer Ansichtsvorlage zurückkehren wollen.

Andere Tipps

Sie können die JsonReturnBinder verwenden für diese:

[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 Vorschlag:

Warum zurückkehren den Statuscode als Teil der Antworttext? gibt es das Feld in Httpstatuscode jede Antwort. es auf den gewünschten Code einstellen wird Client-Code einfacher zu bedienen, plus Ihre Methode wird wieder die gewünschte Zeichenkette, so Unit Testing (können Sie den Statuscode im XMLHttpRequest direkt, und die meisten JS-Bibliotheken haben spezielle Handler für Erfolg und Fehler überprüfen) wäre viel einfacher. Beispiel:

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

Ein weiterer Vorschlag - mische die if / else Blöcke Schachtelungsebenen zu reduzieren:

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

Auf diese Weise beginnt der Code mit Schutzeinrichtungen (Vorbedingungen), und die letzte Rück Anweisung in der Methode stellt die normale Ausführung der Fertigstellung. IMO macht es die Dinge leichter zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top