[英]ASP.NET MVC Custom View Routing
我們的解決方案層次結構如下:
控制器\\目錄\\查看
例如:Controllers \\ DataAnalysis \\ DataRetrieve
現在我想映射路由,以便當用戶只在URL中鍵入視圖的名稱時,它會自動將url映射到相應的控制器
IE:localhost:1234 \\ DataAnalysis \\ DataRetrieve
應映射到
查看\\ DataAnalysis \\ DataRetrieve \\ Index.cshtml
同樣,任何包含操作的url請求都應檢索相應的視圖
IE:localhost:1234 \\ DataAnalysis \\ DataRetrieve \\ TestAction
應映射到
查看\\ 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}"
);
但這是問題所在。 我還想像我這樣組織我的文件結構:
默認情況下,當我嘗試檢索dataretrieve的索引時,它會在Views \\ DataRetrieve \\ Index而不是Views \\ DataAnalysis \\ DataRetrieve \\ Index下查看。
我該如何改變這種行為?
EDIT2 ------------------------
根據答案,我添加了一個自定義視圖引擎,在Application_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 SPCViewEngine : RazorViewEngine
{
public SPCViewEngine()
: 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 categoryName = controllerContext.RouteData.Values["category"].ToString();
return base.CreatePartialView(controllerContext, partialPath.Replace("%1", categoryName));
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
var categoryName = controllerContext.RouteData.Values["category"].ToString();
return base.CreateView(controllerContext, viewPath.Replace("%1", categoryName), masterPath);
}
protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
{
var categoryName = controllerContext.RouteData.Values["category"].ToString();
return base.FileExists(controllerContext, virtualPath.Replace("%1", categoryName));
}
}
如果我正確理解了您的問題,您可以創建自己的視圖引擎,該引擎在運行時解析視圖位置並插入您的應用程序。
創建自己的自定義視圖引擎。
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 }
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.