如果没有控制器/动作匹配,我想在文件夹中显示视图。
例如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}是视图;然后显示该视图。
我怎么能得到那个?
答案 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
处使用 也提供了源代码答案 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);
}
}