代码之家  ›  专栏  ›  技术社区  ›  chakrit Dutchie432

ASP.NET MVC:使用委托字段作为操作方法?

  •  4
  • chakrit Dutchie432  · 技术社区  · 16 年前

    在ASP.NET MVC中,是否可以通过某些扩展/重写点允许将“委托字段”用作“操作”?

    类似于:

    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();
            }
        }
    }
    

    我知道我对这个有点痴迷,但如果这是可能的话,它会开辟出许多新的行动方式。例如,您可以在mvc中使用django风格的通用视图,其中只有一行代码来定义操作,也可以使用不同的方法在多个控制器之间考虑重复逻辑。

    我不知道该在哪里加入这个逻辑,或者需要做多少工作来改变框架中如此基本的东西。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Lance Fisher    16 年前

    你可能需要建立自己的控制器工厂。此类生成控制器,并实现IControllerFactory。您可以从DefaultControllerFactory继承。重写createcontroller()以返回您自己的icontroller。

    使用以下行在MVCAP应用程序的application_start()中注册控制器工厂:

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

    在icontroller的实现中,重写execute方法。您可以使用requestcontext来决定要调用哪个委托。如果您不想完全实现icontroller,那么从controllerbase继承并在其中重写execute可能是最容易的。

    传递到execute的requestcontext携带一个routedata对象。这是一个由路由引擎填充的字典,它告诉您应该调用什么操作以及任何参数。您可以得到这样的操作名称:

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

    你甚至可以把你的动作定义为一个字典,一旦你得到了动作名,就把它们取出来。

    最后,普通操作方法返回一个actionresult,框架使用它来决定要呈现哪个视图。一旦你执行委托,我认为你将不得不在你的特殊基础控制器中手动设置一些东西。我不确定在不打开mvc源代码的情况下设置什么或如何从这里执行视图。

    祝你好运!这看起来是个有趣的主意。

        2
  •  1
  •   Kieron    16 年前

    因为你似乎在实施 BaseController 在代码示例中,如果重写 Execute (从 IController )您可以根据自己的喜好解释请求=>操作。

        3
  •  1
  •   Christian13467    16 年前

    不,它不是。基本控制器正在寻找方法,而不是域来分派操作。

    编辑:
    对不起,我有点快,而且我已经习惯了提供的标准课程。
    您可以这样做,但必须在控制器或实现中覆盖execute方法并提供自己的 IActionInvoker 将操作分派到字段。看那篇文章 action processing in detail . 它详细解释了调度。