Question

Mon projet utilise Castle monorail comme un framework MVC. Le problème est que Monorail exige que tous les contrôleurs ont un modèle de vue. Je suis en train d'obtenir une chaîne de retour d'une méthode sur un contrôleur via un appel AJAX. L'EEG AJAX renvoie toujours une erreur 500 à partir du serveur, car monorail ne peut pas trouver un modèle de vue. J'ai vu d'autres exemples de solutions de contournement dans lequel vous venez de définir le type de retour de la méthode du contrôleur pour annuler (ce monorail signale de ne pas déranger la recherche d'un contrôleur de vue) et ensuite faire quelque chose comme:

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

Pour écrire tout le contexte à l'écran.

J'ai donc la méthode de suivi et essaie d'obtenir la chaîne de retour via un Jquery AJAX GET. Quelqu'un peut-il aider?

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

Comment dois-je faire ce vide de retour et de lire les valeurs de retour via le HttpContext?

Était-ce utile?

La solution

Tous les contrôleurs de monorail dérivés ont accès à une méthode appelée « CancelView () ». Exécutez cette méthode dans la méthode que vous souhaitez revenir sans utiliser un modèle de vue.

Autres conseils

Vous pouvez utiliser le JsonReturnBinder pour cela:

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

suggestion Raffinement:

Pourquoi retourner le code d'état dans le cadre du corps de la réponse? il est le champ de HttpStatusCode dans toute réponse. Réglage au code désiré fera code client plus facile à utiliser (vous pouvez vérifier le code d'état dans le XMLHttpRequest directement, et la plupart des bibliothèques JS satisfaira gestionnaires dédiés pour le succès et les erreurs), ainsi que votre méthode retourne la chaîne désirée, si les tests unitaires serait beaucoup plus facile. Exemple:

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

Une autre suggestion - si la lecture aléatoire / blocs d'autre pour réduire les niveaux de nidification:

[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 cette façon, le code commence par des garanties (conditions préalables), et la dernière déclaration de retour dans la méthode représente l'achèvement de l'exécution normale. L'OMI, il rend les choses plus faciles à lire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top