我在MVC 3中使用多个区域,我遇到了找不到视图的问题。 路由似乎能正确地接收到我的控制器(所有的动作都在执行,没有任何问题),但是当我返回一个视图时,MVC根本找不到它。
因此,如果我在一个叫做 "Some "的区域有一个叫做 "Thing "的简单控制器,并且我做了以下操作......
public ActionResult Index()
{
return View("Index");
}
动作被正确执行,但是MVC没有找到视图,我会得到一个类似于这样的消息。
视图 "索引 "或它的主视图没有找到...... 它将显示我所有搜索的位置,这将是
~ViewsThingIndex.cshtml~ViewsSharedIndex.cshtml。
等等,但看起来并不在。
~SomeViewsThingIndex.cshtml。
有什么想法,我做错了什么?
好吧,很抱歉要回答我自己的问题,但没有人真正给我我正在寻找的答案。 看来我的问题是与自定义路由有关。
为了重新创建这个问题,我创建了一个空白的MVC 3项目,并添加了一个名为 "Some "的区域和一个名为 "Thing "的控制器。 在thing上,我创建了一个Index动作,它只是返回一个视图。 然后我将Index视图添加到~AreasSomeViewsThingIndex.cshtml中。
很好,所以当我点击SomeThingIndex时,它能正确地返回视图。 所以当我点击SomeThingIndex时,它正确地返回了视图。
现在去给Global.asax添加一个类似这样的路由。
routes.MapRoute(
"Custom", // Route name
"Bob", // URL with parameters
new { area = "Some", controller = "Thing", action = "Index" }
);
现在当我导航到Bob时,我得到了我提到的错误 - MVC找不到视图。 为了解决这个问题,我不得不在SomeAreaRegistration类中注册这个路由,而不是Global.asax。 我也不需要'区域'属性,所以它看起来像这样。
context.MapRoute(
"Custom", // Route name
"Bob", // URL with parameters
new { controller = "Thing", action = "Index" }
);
如果你的 控制器与区域名称相同您的控制器将被默认的基本路由所接收。{controller}/{action}
在它检查区域路径之前,因此会在根视图中寻找视图,而不是在区域视图中。重命名区域或控制器可以解决这个问题。
尝试在 global.asax 中添加以下路由。
context.MapRoute(
"default",
"Some/{controller}/{action}/",
new { controller = "Thing", action = "Index"}
);
确保你有一个名为 在你的 "Some "区域上的SomeAreaRegistration.cs 在你的 "Some "区域上,这个文件应该包含如下内容。
public class SomeAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Some";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Some_default",
"Some/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
当使用区域时,把你的index.cshtml放在~AreasSomeViewsThingIndex.cshtml的位置。
你有没有检查(通过设置断点)控制器方法是否被调用?
你列出的搜索视图的页面不在 "some "区域内.你从哪里调用链接?
如果你从其他区域或从根部调用链接,你必须在动作链接中设置区域。
@Html.ActionLink("Go To Some/Thing", "Index", "Thing", new {area="Some"}, null)
我想在这里补充一个解决方案 我也遇到了这个问题,但我的问题是由于Global.asax.cs中的 "catch all "路由有冲突。
删除这个路由后,问题就解决了。
在RouteConfig.cs中试试这个。
也许会对某人有所帮助。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {controller = "Controllername", action = "Actionname", id = UrlParameter.Optional },
namespaces: new [] { "Projectname.Areas.Areaname.Controllers" }
).DataTokens.Add("area", "Areaname");
在*中看不出来~一些*Views......默认情况下(我也不知道你怎么能强行这么做),惯例是~Views......,所以这才是正确的放置视图的地方。如果你想让URL包含 "Some",你可以改变路由来处理。