Domanda

Il mio progetto utilizza Castle Monorail come framework MVC.Il problema è che Monorail richiede che tutti i controller abbiano un modello di visualizzazione.Sto cercando di recuperare una stringa da un metodo su un controller tramite una chiamata AJAX.AJAX GET restituisce sempre un errore 500 dal server perché Monorail non riesce a trovare un modello di vista.Ho visto altri esempi di soluzioni alternative in cui hai semplicemente impostato il tipo di ritorno del metodo del controller su void (questo segnala alla monorotaia di non preoccuparsi di trovare un controller di visualizzazione) e poi fare qualcosa del tipo:

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

Per scrivere semplicemente il contesto sullo schermo.

Quindi ho il metodo follow e sto cercando di ottenere la stringa di ritorno tramite Jquery AJAX GET.Qualcuno può aiutare?

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

Come dovrei rendere nullo questo ritorno e leggere i valori restituiti tramite HTTPCOntext?

È stato utile?

Soluzione

Tutti i controller monorotaia derivati ​​hanno accesso a un metodo chiamato "CancelView()".Esegui questo metodo all'interno del metodo che desideri restituire senza utilizzare un modello di visualizzazione.

Altri suggerimenti

È possibile utilizzare l'JsonReturnBinder per questo:

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

Affinamento suggerimento:

Perché restituire il codice di stato come parte del corpo della risposta? c'è il campo HttpStatusCode in ogni risposta. Impostazione al codice desiderato renderà codice client più facile da usare (è possibile controllare il codice di stato nel XMLHttpRequest direttamente, e la maggior parte delle librerie JS ha dedicato gestori per il successo e gli errori), più il vostro metodo restituirà la stringa desiderata, in modo Unit Testing sarebbe molto più facile. Esempio:

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

Un altro suggerimento - mischiare il if / else blocchi per ridurre i livelli di nidificazione:

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

In questo modo il codice inizia con salvaguardie (pre-condizioni), e l'ultima istruzione return nel metodo rappresenta il completamento normale esecuzione. IMO rende le cose più facili da leggere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top