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

4

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

我知道我有些执着于这个问题,但如果可能的话,它将开辟许多新的行动方式。例如,您可以使用仅一行代码定义操作的Django风格的通用视图在MVC中实现,或者以不同的方式分解多个控制器中的重复逻辑。
我不确定在哪里加入这个逻辑或改变框架中如此基本的内容需要多少工作。

1
这看起来是一个很棒的想法! - Matt Kocaj
聪明的想法,Chakrit!+1 - Robert Koritnik
3个回答

3

您可能需要构建自己的控制器工厂。这个类用于构建控制器并实现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源代码。
祝好运!这看起来像一个有趣的想法。

1

不是这样的。基础控制器正在寻找方法而不是字段来调度操作。

编辑:
抱歉,我有点着急,并修正为提供的标准类。
你可以这样做,但必须在控制器中重写Execute方法或者实现并提供自己的IActionInvoker以将操作调度到字段。请查看文章详细处理操作。它详细解释了调度过程。


2
也许默认控制器无法实现,但在ASP.NET MVC中有一些很好的扩展点可以插入自己的控制器并改变工作方式。 - Lance Fisher

1

从您的代码示例中看来,您似乎正在实现一个BaseController,如果您覆盖Execute(来自IController),则可以根据您的喜好解释请求=>操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接