使用路径处理琐碎和复杂的操作

时间:2012-09-27 13:40:23

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

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

每个Controller都有一个Action,名为“StaticPage(string page)”(考虑创建一个BaseController来从中派生出来但是现在,我们只讨论“Suite”作为Controller)。
此Action返回视图,其中主要包含HTML代码而不包含模型。 因此,我想要一个Action来管理并通过参数区分它们,而不是为20个简单的视图创建20个动作。

但是在同一个Controller上,我希望他们拥有使用Model返回Views的Action,并执行更复杂和数据库相关的操作。首先,我考虑了以下路线(注意:在此场景中,存在“Product”区域):

   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.cshtml TrivialPage.cshtml ,当我打电话给

  

/产品/套件/ TechnicalSpecification

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

  

/产品/套件/ TrivialPage

它还应首先搜索Action“TrivialPage”。但是,当它找不到它时,它应该将它视为一个名为page的参数(就像我上面提到的路径一样)。

但我真的不知道,如何妥善处理这个问题。 有没有设置自定义ActionFilter属性的方法,它检查OnActionExecuted(...)中的某些内容然后执行某些操作来调用“StaticPage”-Action?

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案 重写HandleUnknownAction可以解决问题。 代码如下所示:

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

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

通过这个,我只需要将普通的视图放在相应的View-folder中,如果可用的话,override方法会调用它们。
有了这个,我可以节省很多琐碎的代码,不需要实现这些网站。

相关问题