2009-10-13 10 views
4

Est-il possible dans ASP.NET MVC via certains points d'extension/override de permettre à un "champ délégué" d'être utilisé comme une "action"?ASP.NET MVC: Utilise un champ délégué en tant que méthode d'action?

Quelque chose comme:

using System; 
using System.Web.Mvc; 

namespace Company.Web.Controllers 
{ 
    public class SwitchboardController : BaseController 
    { 
     public Func<ActionResult> Index, Admin, Data, Reports; 

     public SwitchboardController() 
     { 
      // Generic views 
      Index = Admin = Data = Reports = 
       () => View(); 
     } 
    } 
} 

Je sais que je suis un peu puriste pour celui-ci, mais si cela est possible, il avait ouvert de nombreuses nouvelles façons de faire des actions. Vous pouvez, par exemple, avoir des vues génériques de type Django dans MVC avec une seule ligne de code pour définir l'action ou avoir différentes façons de factoriser la logique en double sur plusieurs contrôleurs. Je ne suis pas sûr de savoir où serait l'endroit où appliquer cette logique ou combien de travail serait nécessaire pour modifier quelque chose de fondamental dans le cadre.

+1

cela ressemble à une idée géniale! –

+0

Des trucs astucieux chakrit! +1 –

Répondre

1

Non, ce n'est pas le cas. Le contrôleur de base recherche des méthodes et non des champs pour envoyer une action.

EDIT:
Désolé, j'étais un peu rapide et fixe aux classes standard fournis.
Vous pouvez le faire mais vous devez écraser la méthode Execute dans votre contrôleur ou votre outil et fournir le vôtre IActionInvoker pour répartir l'action dans les champs. Regardez dans le poste action processing in detail. Il explique l'expédition en détail.

+2

Peut-être pas possible avec le contrôleur par défaut, mais il existe de bons points d'extension dans ASP.NET MVC pour brancher vos propres contrôleurs et changer la façon dont les choses fonctionnent. –

+0

Votre droit. J'ai édité ma réponse. – Christian13467

3

Vous devrez probablement construire votre propre usine de contrôleur. Cette classe construit des contrôleurs et implémente IControllerFactory. Vous pouvez hériter de DefaultControllerFactory. Substituez CreateController() pour retourner votre propre IController.

Enregistrez votre usine de contrôleur dans Application_Start() de MvcApplication en utilisant cette ligne:

ControllerBuilder.Current.SetControllerFactory(typeof(MyControllerFactory)); 

Dans votre mise en œuvre de iController, substituez la méthode d'exécution. Vous pouvez utiliser le RequestContext pour décider quel délégué appeler. Il serait probablement plus facile d'hériter de ControllerBase et de surcharger Execute si vous ne voulez pas implémenter complètement IController.

Le RequestContext transmis à Execute contient un objet RouteData. C'est un dictionnaire peuplé par le moteur de routage qui vous indique quelle action doit être appelée, et tous les paramètres. Vous pouvez obtenir le nom d'action comme celui-ci:

//context is a RequestContext object passed to IController.Execute() 
string actionName = requestContext.RouteData.Values["action"]; 

Vous pouvez même définir votre action comme un dictionnaire, et il suffit de les retirer une fois que vous obtenez le nom de l'action. Une dernière chose, les méthodes d'action normales retournent un ActionResult, que le framework utilise pour décider quelle vue afficher. Une fois que vous aurez exécuté vos délégués, je pense que vous devrez configurer manuellement certains éléments dans votre contrôleur de base spécial. Je ne suis pas exactement sûr de ce que vous devez définir ou comment exécuter votre vue à partir d'ici sans ouvrir la source MVC.

Bonne chance! Cela ressemble à une idée intéressante.

1

Comme vous semblez implémenter un BaseController dans votre exemple de code, si vous remplacez le Execute (à partir du IController), vous pourrez interpréter l'action request => comme bon vous semble.

Questions connexes