在ASP.net MVC中显示没有控制器或操作的文件夹中的视图
本文关键字:操作 视图 控制器 文件夹 net ASP MVC 显示 | 更新日期: 2023-09-27 18:16:30
如果没有控制器/动作匹配,我想在文件夹中显示视图。
例如www.site.com/Home/Index,如果我有正常的默认路由{controller}/{action}/{id},那么我需要一个方法为Index的HomeController。Views文件夹中有一个名为Home的文件夹文件是index。cshtml
如果我尝试www.site.com/About/Index,我需要创建AboutController和方法索引。但是我只有About文件夹和Index.cshtml文件
我想如果默认路由不匹配,但我有一个文件夹和文件在视图文件夹匹配模式:{controller}是文件夹{action}是视图;然后显示该视图。
我怎么才能做到呢?
对于缺失的操作,您可以重写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);
}
}
}
我最近在开发AJAX web应用程序时遇到了同样的问题,其中大多数页面实际上不需要控制器(所有数据都通过web API调用返回)。
有几十个控制器都有一个单一的动作返回视图似乎效率低下,所以我开发了ControllerLess插件,其中包括一个默认的视图控制器在后台与单一的动作。
如果你为你的视图创建一个控制器,那么MVC将使用它。但是,如果你创建了一个没有控制器的视图,请求会通过默认的插件控制器重新路由。
它与c#和VB一起工作。NET和us可在https://www.nuget.org/packages/ControllerLess
源代码也可以在GitHub上获得https://github.com/brentj73/ControllerLess
你不能也不应该随心所欲。视图不能通过设计来解决(在web中)。/views文件夹中的HttpNotFoundHandler有一个映射到*的HttpNotFoundHandler来确保这一点)
话虽如此,你在这里想要的不是真正的标准,所以你为什么要这样做,也许我们可以提出一个更好的建议,基于这背后的原因?
从未尝试过,但这里有一个想法。你可以为路由设置约束,因此你应该能够创建一个匹配"{folder}/{file}"的路由,在那里你可以将它们约束为有效值(你可以谷歌这个,或者在SO上搜索她),并设置它在一个FileController(任意名称)上运行,并带有一些默认操作。然后,在该操作中,只需返回所需的视图。比如:
public class FileController : Controller {
public ActionResult Default(string folder, string file) {
return View(folder + "/" + file);
}
}