在ASP.net MVC中显示没有Controller或Action的文件夹中的视图

时间:2011-12-04 01:13:08

标签: c# .net asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

如果没有控制器/动作匹配,我想在文件夹中显示视图。

例如www.site.com/Home/Index,如果我有正常的默认路由{controller} / {action} / {id},那么我需要一个带方法索引的HomeController。 View文件夹中有一个名为Home的文件夹和文件Index.cshtml

如果我尝试www.site.com/About/Index,我需要创建AboutController和方法索引。 但我只有文件夹About和文件Index.cshtml。

我想如果默认路由不匹配但我在Views文件夹中有一个与patern匹配的文件夹和文件:{controller}是文件夹{action}是视图;然后显示该视图。

我怎么能得到那个?

4 个答案:

答案 0 :(得分:4)

对于缺失的操作,您可以覆盖HandleUnknownAction

对于缺少的控制器,您可以实现自定义DefaultControllerFactory并使用以下内容覆盖GetControllerInstance:

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {

   if (controllerType == null)
      return new DumbController();

   return base.GetControllerInstance(requestContext, controllerType);
}

class DumbController : Controller {

   protected override void HandleUnknownAction(string actionName) {

      try {
         View(actionName).ExecuteResult(this.ControllerContext);
      } catch (Exception ex) {
         throw new HttpException(404, "Not Found", ex);
      }
   }
}

答案 1 :(得分:2)

我最近在开发AJAX Web应用程序时遇到了同样的问题,其中大多数页面实际上并不需要控制器(所有数据都是通过Web API调用返回的)。

让几十个控制器都返回视图的单个操作似乎效率低下,因此我开发了 ControllerLess 插件,其中包含一个默认的视图控制器,只需一个动作。

如果为视图创建控制器,则MVC将使用该控制器。但是,如果您创建没有控制器的视图,则会通过默认插件控制器重新路由该请求。

它适用于C#和VB.NET,我们可以在https://www.nuget.org/packages/ControllerLess

处使用

GitHub上的https://github.com/brentj73/ControllerLess

也提供了源代码

答案 2 :(得分:1)

你不能也不应该以你想要的方式。视图无法通过设计解决(在/ views文件夹中的web.config中,HttpNotFoundHandler映射到*以确保这一点)

话虽如此,你想要的不是真正的标准所以你为什么要这样做,也许我们可以根据背后的原因提出更好的建议?

答案 3 :(得分:0)

从未尝试过这个,但这是一个想法。您可以为路线设置约束,因此您应该能够创建匹配“{folder} / {file}”的路线,您可以将它们约束为有效值(您可以谷歌这个,或者在SO上搜索她),并设置它使用一些默认操作在FileController(任意名称)上运行。然后,在该操作中,只需返回所需的视图。类似的东西:

public class FileController : Controller {
    public ActionResult Default(string folder, string file) {
        return View(folder + "/" + file);
    }
}