Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC自定义视图路由_C#_.net_Asp.net Mvc 4_Url_Razor - Fatal编程技术网

C# ASP.NET MVC自定义视图路由

C# ASP.NET MVC自定义视图路由,c#,.net,asp.net-mvc-4,url,razor,C#,.net,Asp.net Mvc 4,Url,Razor,我们的解决方案层次结构如下: 控制器\类别\视图 例: 控制器\数据分析\数据检索 现在我想映射路由,这样当用户在url中键入视图的名称时,它会自动将url映射到相应的控制器 即:localhost:1234\DataAnalysis\DataRetrieve 应该映射到 View\DataAnalysis\DataRetrieve\Index.cshtml 类似地,任何包含操作的url请求都应该检索相应的视图 即:localhost:1234\DataAnalysis\DataRetrieve

我们的解决方案层次结构如下:

控制器\类别\视图

例: 控制器\数据分析\数据检索

现在我想映射路由,这样当用户在url中键入视图的名称时,它会自动将url映射到相应的控制器

即:localhost:1234\DataAnalysis\DataRetrieve

应该映射到

View\DataAnalysis\DataRetrieve\Index.cshtml

类似地,任何包含操作的url请求都应该检索相应的视图

即:localhost:1234\DataAnalysis\DataRetrieve\TestAction

应该映射到

View\DataAnalysis\DataRetrieve\TestAction.cshtml

目前,我们使用的是默认路由

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
        );
    }
这意味着如果我键入上面显示的URL,它将忽略该类别并无法返回视图

有没有办法自定义路由以获得上述行为

--编辑

为了根据评论澄清我的问题,这里是我的解决方案浏览器的屏幕截图

现在,如果我调用localhost:12346/DataAnalysis/DataRetrieve,这应该会将我带到索引。路由这不是问题,因为我可以这样做:

        routes.MapRoute(
            name: "ExampleRouting",
            url: "{category}/{controller}/{action}"
        );
但问题是。我还希望像这样组织我的文件结构:

        routes.MapRoute(
            name: "ExampleRouting",
            url: "{category}/{controller}/{action}"
        );

默认情况下,当我尝试检索dataretrieve的索引时,它会在Views\dataretrieve\index而不是Views\DataAnalysis\dataretrieve\index下查找

我怎样才能改变这种行为

编辑2------------------------

根据答案,我添加了一个自定义视图引擎,在应用程序_Start中注册,更新了我的路由。仍然有相同的问题

Global.asax

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        ViewEngines.Engines.Add(new SPCViewEngine());

        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
    }
}
RouteConfig.cs

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


        routes.MapRoute(
           name: "Default",
           url: "{controller}/{category}/{action}/{id}",
           defaults: new { controller = "Login", action = "Index", category = "Login", id = UrlParameter.Optional }
        );
    }
SPCViewEngine(自定义视图引擎)


如果我正确理解了您的问题,您可以创建自己的视图引擎,该引擎在运行时解析视图位置并插入应用程序

创建自己的自定义视图引擎

    public class MyViewEngine : RazorViewEngine
{
    public MyViewEngine()
        : base()
    {
        ViewLocationFormats = new[] {
        "~/Views/{1}/%1/{0}.cshtml",
        "~/Views/{1}/%1/{0}.vbhtml",
        "~/Views/Shared/{0}.cshtml",
        "~/Views/Shared/{0}.vbhtml"
    };

    PartialViewLocationFormats = new[] {
        "~/Views/%1/{1}/{0}.cshtml",
        "~/Views/%1/{1}/{0}.vbhtml",
        "~/Views/Shared/{0}.cshtml",
        "~/Views/Shared/{0}.vbhtml"
    };
    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        var catagoryName = controllerContext.RouteData.Values["category"].ToString();
        return base.CreatePartialView(controllerContext, partialPath.Replace("%1", catagoryName));
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        var catagoryName = controllerContext.RouteData.Values["category"].ToString();
        return base.CreateView(controllerContext, viewPath.Replace("%1", catagoryName),masterPath);
    }

    protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
    {
        var catagoryName = controllerContext.RouteData.Values["category"].ToString();
        return base.FileExists(controllerContext, virtualPath.Replace("%1", catagoryName));
    }

}
在这里注册

protected void Application_Start()
{   
   AreaRegistration.RegisterAllAreas();

   RegisterGlobalFilters(GlobalFilters.Filters);
   RegisterRoutes(RouteTable.Routes);


   //Register your View Engine Here.
   ViewEngines.Engines.Add(new MyViewEngine());
}
更新路由配置,默认值应为

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{category}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", category = "DefaultCategoryName", id = UrlParameter.Optional }
        );

那么DataAnalysis是您的控制器,或者是您项目的名称,而DataRetrieve是您的控制器?我很困惑,或者您是。布线与视图无关。路由只路由到控制器操作。我建议使用区域组织应用程序。请参阅。@Onots几乎所有的页面都将使用相同的共享布局文件,坦率地说,我们认为在区域下重新配置它们的共享布局设置(包括所有子渲染属性)会非常繁忙,除非我们错了,并且有一个简单的方法来解决这个问题。@l46kok我希望您可以使用Area _viewStart来引用相同的(共享的)根布局设置。不过我还没有亲自处理过这件事。这就是为什么我要发表评论而不回答:你的答案似乎是正确的,但出于某种原因,它仍然不起作用。在404中请求localhost/DataAnalysis/DataRetrieve会导致错误,当我在自定义viewengine中设置调试点时,没有调用任何重写方法。但是,当我尝试localhost:12346/DataRetrieve/TestAction而不使用前面的类别时,它可以工作。编辑:没关系,后一部分也不起作用。您是否在应用程序启动中注册了视图引擎并更新了路由配置?我在我的本地主机上尝试了这个方法,它对我有效,而且调试点应该在每个请求上都会命中。是的。我会立即用更新的内容编辑我的问题。哇。。只需调用ViewEngines.Engines.Clear()就解决了这个问题。。我猜它仍然使用默认的视图引擎。非常感谢!