子文件夹下的MVC路由

我需要一些路由帮助。 我试图找到现有的问题 - 答案,但没有什么是帮助我。 如果已经有答案,请将其链接。

我的结构:

/Controller
--/Root
----/HomeController.cs
/Views
--/Root
----/Home
------/Index.cshtml

问题是,无法找到Index.cshtml。

没有找到'Index'或其主人的视图。 搜索了以下位置:

〜/浏览/首页/的Index.aspx
〜/浏览/首页/ Index.ascx
〜/查看/共享/的Index.aspx
〜/查看/共享/ Index.ascx
〜/浏览/首页/ Index.cshtml
〜/浏览/首页/ Index.vbhtml
〜/查看/共享/ Index.cshtml
〜/查看/共享/ Index.vbhtml

堆栈跟踪:

System.Web.Mvc.ViewResult.FindView(ControllerContext上下文)+382 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext上下文)+116 System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult actionResult)+13系统。 Web.Mvc。<> c__DisplayClass1a.b__17()+23 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter,ResultExecutingContext preContext,Func 1 continuation) +245<br /> System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +22 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList 1 filters,ActionResult actionResult)+176 System.Web.Mvc.Async。<> c__DisplayClass2a.b__20()+75 System.Web。 Mvc.Async。<> c__DisplayClass25.b__22(IAsyncResult asyncResult)+99 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +50 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +16 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +50 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +16 System.Web.Mvc.Async.WrappedAsyncResult 1.End()+50 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult的asyncResult)36 System.Web.Mvc.Async。<> c__DisplayClass4.b__3(IAsyncResult的AR)16 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +50 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +16 System.Web.Mvc.Async.WrappedAsyncResult 1.End()+50 System。 Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+28 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)+9 System.Web.CallHandlerExecutionStep.S ystem.Web.HttpApplication.IExecutionStep.Execute()9721605 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔逻辑completedSynchronously)155

路由是这样的:

routes.MapRoute(
    name: "Home",
    url: "Root/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    ).DataTokens.Add("app", "Home");

有什么我错过了吗?


默认情况下,MVC在~/Views/YourControllerName文件夹中查找视图。 看起来你的控制器和视图有一个名为root的目录。 我不知道你为什么想这样做。 如果你这样做是为了在你的项目中合理地组织代码,你应该考虑区域。

您可以创建一个名为root的新区域。 这将在~/Areas下创建一个名为root的目录。 您可以在其下创建控制器和视图。 当你定义你的路线时,你不需要在你的url中包含Root这个词,因为你将有一个区域注册以Root开头(你可以自定义)

但是,如果您确实不想使用区域,但希望将视图保留在~/Views/root目录下,则可以创建自定义视图引擎并指定在哪里查找视图文件。

public class MyCustomViewEngine : RazorViewEngine
{
    public MyCustomViewEngine()
    {
        string[] viewLocationFormatArr=new string[4];
        viewLocationFormatArr[0] = "~/Views/root/{1}/{0}.cshtml";
        viewLocationFormatArr[1] = "~/Views/Root/{1}/{0}.vbhtml";
        viewLocationFormatArr[2] = "~/Views/Shared/{1}/{0}.vbhtml";
        viewLocationFormatArr[3] = "~/Views/Shared/{1}/{0}.vbhtml";
        this.ViewLocationFormats = viewLocationFormatArr;

        string[] masterLocationFormatArr = new string[4];
        masterLocationFormatArr[0] = "~/Views/root/{1}/{0}.cshtml";
        masterLocationFormatArr[1] = "~/Views/root/{1}/{0}.vbhtml";
        masterLocationFormatArr[2] = "~/Views/Shared/{1}/{0}.vbhtml";
        masterLocationFormatArr[3] = "~/Views/Shared/{1}/{0}.vbhtml";
        this.MasterLocationFormats = masterLocationFormatArr;

        string[] partialViewLocationFormatArr = new string[4];
        partialViewLocationFormatArr[0] = "~/Views/root/{1}/{0}.cshtml";
        partialViewLocationFormatArr[1] = "~/Views/root/{1}/{0}.vbhtml";
        partialViewLocationFormatArr[2] = "~/Views/Shared/{1}/{0}.vbhtml";
        partialViewLocationFormatArr[3] = "~/Views/Shared/{1}/{0}.vbhtml";
        this.ViewLocationFormats = partialViewLocationFormatArr;

    }
}

确保在Application_Start事件中注册此自定义视图引擎。

ViewEngines.Engines.Clear();
var ourViewEngine = new MyCustomViewEngine();
ViewEngines.Engines.Add(ourViewEngine);

关于从自定义位置渲染视图的详细博客在这里。

链接地址: http://www.djcxy.com/p/72699.html

上一篇: MVC Routing below sub folders

下一篇: Umbraco Cannot render a macro when there is no current PublishedContentRequest