我有一个自定义RouteBase
,MyRoute
我想为区域"MyArea"
工作,其中包含以下代码:
public override GetRouteData(HttpContextBase httpContext)
{
var result = new RouteData(this, new MvcRouteHandler());
result.Values.Add("area", "MyArea");
result.Values.Add("controller", "MyController");
result.Values.Add("action", "Index");
}
我在MyAreaAreaRegistration.cs
文件中注册了这个:
public override string AreaName { get { return "MyArea"; } }
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.Add(new MyRoute());
// other routes
context.MapRoute(/* ... */);
}
在发出请求时,它成功调用Index
上的MyController
操作:
public ActionResult Index()
{
return this.View();
}
但是,MVC没有在视图的正确文件夹中搜索:
当视图位于时视图'索引'或者找不到它的主人,或者没有视图引擎支持搜索到的位置。搜索了以下位置:
〜/查看/ myController的/的Index.aspx
〜/查看/ myController的/ Index.ascx
〜/查看/共享/的Index.aspx
〜/查看/共享/ Index.ascx
〜/查看/ myController的/ Index.cshtml
〜/查看/ myController的/ Index.vbhtml
〜/查看/共享/ Index.cshtml
〜/ Views / Shared / Index.vbhtml
~/Areas/MyArea/Views/MyController/Index.cshtml
如何在正确的区域进行MVC搜索?
答案 0 :(得分:0)
如果您查看AreaRegistrationContext.MapRoute
的来源,您会发现它将该区域与其他路线变量区别对待:
public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces)
{
if (namespaces == null && this.Namespaces != null)
{
namespaces = this.Namespaces.ToArray<string>();
}
Route route = this.Routes.MapRoute(name, url, defaults, constraints, namespaces);
route.DataTokens["area"] = this.AreaName; // *** HERE! ***
bool flag = namespaces == null || namespaces.Length == 0;
route.DataTokens["UseNamespaceFallback"] = flag;
return route;
}
从this.AreaName
填充AreaRegistration
。
因此,问题的快速解决方法是更换呼叫:
result.Values.Add("area", "MyArea");
与
result.DataTokens["area"] = "MyArea";