MVC区域 - 未找到视图

use*_*827 14 asp.net-mvc asp.net-mvc-areas

我有一个使用MVC区域的项目.该区域包含整个项目,而区域外的主"视图/控制器/模型"文件夹为空,禁止我设置的调度控制器将默认传入请求路由到我所在区域的Home Controller.

该控制器有如下方法: -

public ActionResult Index(string id)
    {
        return RedirectToAction("Index", "Home", new {area = "xyz"});
    }   
Run Code Online (Sandbox Code Playgroud)

我也有一个默认的路由设置来使用这个控制器如下: -

routes.MapRoute(
            "Default",                                              // Default route
            "{controller}/{action}/{id}",
            new { controller = "Dispatch", action = "Index", id = UrlParameter.Optional }
        );   
Run Code Online (Sandbox Code Playgroud)

对我的站点的任何默认请求都适当地路由到相关区域.Area的"RegisterArea"方法只有一条路线: -

context.MapRoute(
            "xyz_default",
            "xyz/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
Run Code Online (Sandbox Code Playgroud)

我的区域有多个控制器,有很多视图.在这些控制器方法中对特定视图的任何调用,如"返回视图("blah");呈现正确的视图.但是,每当我尝试返回视图以及作为参数传入的模型对象时,我会收到以下错误: -

Server Error in '/DeveloperPortal' Application.
The view 'blah' or its master was not found. The following locations were searched:
~/Views/Profile/blah.aspx
~/Views/Profile/blah.ascx
~/Views/Shared/blah.aspx
~/Views/Shared/blah.ascx 
Run Code Online (Sandbox Code Playgroud)

每当模型对象作为参数传入时,它看起来都像.到"View()"方法[例如返回View("blah",obj)]它在项目的根目录中而不是在区域特定的视图文件夹中搜索视图.

我在这里错过了什么?

提前致谢.

use*_*827 8

解决了 !我的一些"RedirectToAction"调用没有在该方法的routeobject集合参数中明确指定区域名称.奇怪的是,即使控制器重定向都在同一区域,这也是必需的.此外,当我没有在其routeobject集合中指定新的{area ="blah"}时,HtmlActionLinks工作正常,所以我想知道为什么控制器动作调用RedirectToAction()需要,即使调用和被调用的控制器都有动作都属于同一地区.


小智 6

如果你用而不是

context.MapRoute(
        "xyz_default",
        "xyz/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
Run Code Online (Sandbox Code Playgroud)

使用

context.MapRoute(
        "xyz_default",
        "{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
Run Code Online (Sandbox Code Playgroud)

在你的

xyzAreaRegistration.cs

那么你不需要在任何链接中明确指定你的区域......

  • 这种方式对我有用,但有另一个问题.路径正在命中正确的控制器,但找不到视图(它在主项目目录中查找默认视图而不是在区域中,这是我需要的). (3认同)

Jef*_*mer 5

在Controller类上添加RouteArea属性,以便MVC知道对视图使用“ XYZ”区域(然后您可以将AreaPrefix设置为空字符串,因此路由不需要以“ XYZ”开头)。

[RouteArea("Xyz", AreaPrefix = "")]
public class XyzController : Controller   
{
...
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*vey 4

如果这是路由问题,您可以通过注册您的区域路由来解决它。这会导致路由引擎在匹配根路由之前尝试匹配区域路由之一:

AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
Run Code Online (Sandbox Code Playgroud)

如果我通过重命名区域应用程序中的视图文件夹之一来强制发生错误,我会收到与您不同的错误:

未找到视图“索引”或其主视图。以下地点
  被搜索:

〜/区域/xyz/Views/Document/Index.aspx
〜/区域/xyz/Views/Document/Index.ascx
〜/区域/xyz/Views/Shared/Index.aspx
〜/区域/xyz/Views/Shared/Index.ascx

...然后是通常的根视图文件夹..

..如果它认为它位于某个区域,它将搜索的子目录模式。