【问题标题】:Handling trivial and complex Actions with Routes使用路由处理琐碎和复杂的操作
【发布时间】:2012-09-19 07:43:47
【问题描述】:

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

每个 Controller 都有一个名为“StaticPage(string page)”的 Action(考虑创建一个 BaseController 以从它派生,但现在,我们只讨论作为 Controller 的“Suite”)。
此操作返回视图,这些视图主要包含 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
   );

假设我们得到了视图 TechnicalSpecification.cshtmlTrivialPage.cshtml,当我调用

/产品/套件/技术规范

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

/产品/套件/TrivialPage

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

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

【问题讨论】:

    标签: asp.net asp.net-mvc-3 view controller routes


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-29
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多