0

我想像这样设计我们的控制器和动作:

每个控制器都有一个名为“StaticPage(string page)”的动作(考虑创建一个 BaseController 以从它派生,但现在,我们将只讨论作为控制器的“套件”)。
此操作返回视图,这些视图主要包含 HTML 代码,没有模型。因此,我不想为 20 个琐碎的视图创建 20 个动作,而是希望一个动作通过一个参数来管理和区分它们。

但是在同一个控制器上,我希望他们拥有返回带有模型的视图并执行更复杂和与数据库相关的事情的操作。起初,我考虑了以下路线(注意:在这个场景中,存在一个“产品”区域):

   context.MapRoute(
       "Product_default",
       "Product/{controller}/{action}",
       new { action = "index"}
   );

   context.MapRoute(
      "StaticPage_Route",
      "Product/{controller}/{page}",
      new { action = "StaticPage", page = UrlParameter.Optional
   );

所以假设我们得到了 View TechnicalSpecification.cshtmlTrivialPage.cshtml,当我打电话时

/产品/套件/技术规格

它应该搜索并找到操作“TechnicalSpecification”,但是当我尝试

/产品/套件/TrivialPage

它还应该首先搜索“TrivialPage”操作。但是,当它没有找到它时,它应该将其视为一个名为 page 的参数(就像我上面提到的 Routes 中一样)。

但我真的不知道,如何管理这个权利。有没有办法在不设置自定义 ActionFilter 属性的情况下检查 OnActionExecuted(...) 中的某些内容,然后执行某些操作来调用“StaticPage”-Action?

4

1 回答 1

0

我自己找到了解决方案。
覆盖 HandleUnknownAction 就可以了。代码如下所示:

protected override void HandleUnknownAction(string actionName)
        {
            this.View(actionName).ExecuteResult(this.ControllerContext);
        }

此外,不再需要路线“StaticPage_Route”,因此我删除了该路线。

这样,我只需要将琐碎的视图放在相应的视图文件夹中,如果可用,覆盖方法就会调用它们。
有了这个,我可以节省很多琐碎的代码,并且不需要实现这些站点。

于 2012-09-28T13:12:24.090 回答