MVC ControllerActionInvoker和调用动作

时间:2010-08-08 09:03:20

标签: asp.net-mvc-2 controlleractioninvoker

是否可以使用自定义动作调用程序而无需在Controller处理程序工厂中实例化它?例如,在自定义控制器工厂中:

IController IControllerFactory.CreateController(RequestContext reqContext, string controllerName)
{
    var controller = base.CreateCOntroller(reqContext,controllerName ) as Controller;
    controller.ActionInvoker = new CustomActionInvoker();
}

或者是否有另一种方法可以执行MVC操作而无需使用自定义动作调用程序?

更新问题

我有一个控制器,说HomeControllerIndex动作。 Index是控制器中的主要操作。执行Index操作后,MVC视图将使用Ajax -GET请求(我们使用 jTemplates )触发多个操作。

实施例

// Controller actions

// main action and View
public ActionResult Index() { ... }

public ActionResult AjaxAction1(string id) { ... }
public ActionResult AjaxAction2() { ... }
public ActionResult AjaxAction3() { ... }

现在我想根据某些情况过滤掉一些不执行的操作。例如,当AjaxAction1等于2时,我想停止执行id

回到我原来的问题。有没有办法在不使用动作调用者的情况下实现这一点。我不想使用动作调用者的原因是我的项目结构以循环引用结束的方式。

任何想法都非常感激。

2 个答案:

答案 0 :(得分:1)

找到你可以继承Controller并在那里创建ControllerActionInvoker的答案。

答案 1 :(得分:0)

使用操作方法选择器

取决于id等于2时发生的情况,但通过编写自定义操作方法选择器可以很容易地完成此操作。

使用操作方法选择器,您可以提供根据参数值执行的操作:

[RequiresParameterValue("id", @"^2$")]
[ActionName("AjaxAction")]
public ActionResult AjaxAction1(string id) { ... }

[RequiresParameterValue("id", @"^[^2]*$")]
[ActionName("AjaxAction")]
public ActionResult AjaxAction2(string id) { ... }

从这个例子中可以看出,自定义操作方法选择器有两个参数:

  • 控制器操作参数名称(示例中为id
  • 检查控制器操作参数值的正则表达式

当客户端来自客户端时,操作方法选择器会将所有路由值视为字符串,因此您可以使用正则表达式将其拉出。而且它也非常灵活。

第一个操作方法将在id == "2"时执行,第二个操作方法将在id != "2"时执行。