2014-06-27 5 views
0

J'ai un contrôleur qui a plus de 50 fonctions privées qui retournent le type JsonResult. J'essaye de créer un JsonResult générique qui accepte une chaîne de nom qui correspond à l'une des 50+ fonctions JsonResult privées.Appelez JsonResult par nom de chaîne

Je veux faire quelque chose comme ceci:

public JsonResult View(Guid id, string funcName) 
    {   
     return RedirectToAction(funcName, "myController", new { id = id}); 
    } 

mais cela ne fonctionnera pas parce que « RedirectToAction » retourne un ActionResult, pas JsonResult. Y at-il un moyen de faire ce travail?

+0

Side note: « 50+ fonctions privées » - et le fait que les actions doivent être les méthodes publiques rendent votre échantillon un peu étrange. –

+0

"J'ai un contrôleur qui a plus de 50 fonctions privées" C'est quelque chose que vous devez corriger. Trop de méthodes dans une classe sera une douleur à maintenir. Essayez de refactoriser ces méthodes si vous le pouvez. Peut-être avez-vous besoin de plus d'un contrôleur dans le projet? Ou peut-être mettre ces méthodes dans des classes d'aides distinctes? –

+0

On dirait que vous avez un gros problème de code structurel là-bas. – CodingIntrigue

Répondre

2

Vous pouvez utiliser la réflexion:

public ActionResult View(Guid id, string funcName) 
{   
    return (ActionResult)this.GetType().GetMethod(funcName).Invoke(this, new object[]{id}); 
} 

Comme mentionné dans les commentaires. Si sa méthode privée, vous aurez besoin d'ajouter des indicateurs de liaison:

return (ActionResult)this.GetType().GetMethod(funcName, BindingFlags.NonPublic | BindingFlags.Instance).Invoke(this, new object[]{id}); 
+1

+1. La réflexion est en effet la seule façon d'appeler une fonction privée par son nom (peut-être besoin d'ajouter des drapeaux pour trouver une méthode privée). 'RedirectToAction' n'aidera pas puisque les méthodes' private' ne peuvent pas être des actions. –

+0

@AlexeiLevenkov ty, mise à jour de la réponse – Uriil

+0

Oui, c'est ce dont j'avais besoin. Merci les gars. – Losbear

0

JsonResult hérite de ActionResult. Vous pouvez simplement faire en sorte que votre action Afficher la renvoie.

public ActionResult View(Guid id, string funcName) 
{   
    return RedirectToAction(funcName, "myController", new { id = id}); 
} 

Si votre RedirectToAction ligne retourne un JsonResult, il traitera de manière appropriée. MVC s'en fiche.

+0

Hmm, n'avait pas essayé cela. Je pensais que si je retournais Json dans un ActionResult, les en-têtes seraient différents et cela gâcherait mon code jquery ajax. Je vais l'essayer maintenant. – Losbear

+0

@Losbear - notez que la partie principale de cette réponse est "* votre ligne * RedirectToAction renvoie un JsonResult", car le framework one renvoie la redirection. –