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

时间:2009-10-13 06:39:32

标签: asp.net-mvc

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 个答案:

答案 0 :(得分:3)

您可能需要构建自己的Controller工厂。该类构建控制器,并实现IControllerFactory。您可以从DefaultControllerFactory继承。覆盖CreateController()以返回您自己的IController。

使用以下行在MvcApplication的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源的情况下从这里执行View。

祝你好运!这看起来很有意思。

答案 1 :(得分:1)

不,不是。基本控制器正在寻找方法而不是字段来分派动作。

修改
对不起,我有点快,并修复了所提供的标准课程 您可以这样做,但您必须覆盖控制器中的执行方法或实现并提供您自己的IActionInvoker来将操作分派给字段。查看帖子action processing in detail。它详细解释了调度。

答案 2 :(得分:1)

由于您似乎在代码示例中实现了BaseController,如果您覆盖Execute(来自IController),您将能够解释请求=&gt;但是你喜欢的行动。