MVC 控制器分组开发问题
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------
未找到视图“MyIndex”或其母版视图。搜索了以下位置:
~/Views/MyStruct/MyIndex.aspx
~/Views/MyStruct/MyIndex.ascx
~/Views/Shared/MyIndex.aspx
~/Views/Shared/MyIndex.ascx
上面是我出现的问题,很明显是找不到资源,我检查了很多遍,也没有找出问题,我测试了几遍,可能是解析引擎的问题,但是我没能够找出来,请高手指教
一下是我的部分源代码
global中的代码
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.CreateArea("Blogs", "MvDestoryTheConstruct.Areas.Blogs.Controllers", routes.MapRoute(
null,
"Blogs/{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "MyStruct", action = "Index", id = UrlParameter.Optional }));
}
protected void Application_Start()
{
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new AreaViewEngine());
//AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
我自定义的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
namespace MvDestoryTheConstruct
{
//新建路由设置拓展方法
public static class AreaRouteHelp
{
public static void CreateArea(this RouteCollection routes, string areaName, string controllersNamespace, params Route[] routeEntries)
{
foreach (var route in routeEntries)
{
if (route.Constraints == null)
{
route.Constraints = new RouteValueDictionary();
}
if (route.DataTokens == null)
{
route.DataTokens = new RouteValueDictionary();
}
if (route.Defaults == null)
{
route.Defaults = new RouteValueDictionary();
}
route.Constraints.Add("area", areaName);
route.Defaults.Add("area", areaName);
route.DataTokens.Add("namespaces",new string[]{controllersNamespace});
//将路由添加到路由表中
if (!routes.Contains(route))
{
routes.Add(route);
}
}
}
}
}
这是我自定义的解析引擎
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvDestoryTheConstruct
{
public class AreaViewEngine:WebFormViewEngine
{
public AreaViewEngine():base()
{
ViewLocationFormats = new []{
"/{0}.aspx",
"/{0}.ascx",
"/View/{1}/{0}.aspx",
"/View/{1}/{0}.ascx",
"/View/Shared/{0}.aspx",
"/View/Shared/{0}.ascx",
};
MasterLocationFormats = new[]
{
"/{0}.master",
"/{0}.master",
"/View/{1}/{0}.master",
"/View/{1}/{0}.master",
"/View/Shared/{0}.master",
"/View/Shared/{0}.master",
};
PartialViewLocationFormats = ViewLocationFormats;
}
private static string FromateSharedViewName(ControllerContext controllerContext, string viewName)
{
string area=controllerContext.RouteData.Values["area"].ToString();
return "Areas/" + area + "Views/Shared/" + viewName;
}
private static string FormatiViewName(ControllerContext controllerContext,string viewName)
{
string controllerName=controllerContext.RouteData.GetRequiredString("controller");
string area=controllerContext.RouteData.Values["area"].ToString();
return "Areas/"+area+"/Views/"+controllerName+"/"+viewName;
}
//解析部分视图
public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
{
ViewEngineResult areaResult = null;
if (controllerContext.RouteData.Values.ContainsKey("area"))
{
//解析文件夹中的partialview
string areaPartialName = FormatiViewName(controllerContext, partialViewName);
areaResult = base.FindPartialView(controllerContext, areaPartialName, useCache);
if (areaResult != null && areaResult.View != null)
{
return areaResult;
}
//解析共享文件夹中的partialview
string sharedPartialName = FromateSharedViewName(controllerContext, partialViewName);
areaResult = base.FindPartialView(controllerContext, sharedPartialName, useCache);
if (areaResult != null && areaResult.View != null)
{
return areaResult;
}
}
return base.FindPartialView(controllerContext, partialViewName, useCache);
}
//解析视图
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
ViewEngineResult areaResult = null;
if (controllerContext.RouteData.Values.ContainsKey("area"))
{
string areaViewName = FormatiViewName(controllerContext, viewName);
areaResult = base.FindView(controllerContext, areaViewName,masterName, useCache);
if (areaResult != null && areaResult.View != null)
{
return areaResult;
}
string shareViewName = FromateSharedViewName(controllerContext, viewName);
areaResult = base.FindView(controllerContext, shareViewName,masterName, useCache);
if (areaResult != null && areaResult.View != null)
{
return areaResult;
}
}
return base.FindView(controllerContext, viewName, masterName, useCache);
}
}
}