【问题标题】:MVC Areas - View not foundMVC 区域 - 未找到视图
【发布时间】:2011-02-07 03:34:54
【问题描述】:

我有一个使用 MVC 区域的项目。该区域包含整个项目,而区域之外的主要“视图/控制器/模型”文件夹是空的,除非调度控制器我已设置将默认传入请求路由到我所在区域的主控制器。

这个控制器有一个方法如下:-

public ActionResult Index(string id)
    {
        return RedirectToAction("Index", "Home", new {area = "xyz"});
    }   

我还有一个默认路由设置来使用这个控制器,如下所示:-

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

对我网站的任何默认请求都会适当地路由到相关区域。 Area 的“RegisterArea”方法只有一条路由:-

context.MapRoute(
            "xyz_default",
            "xyz/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }

我的区域有多个控制器,有很多视图。在这些控制器方法中对特定视图的任何调用,例如 "return View("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 

看起来就像模型对象作为参数传入时一样。到“View()”方法[例如return View("blah",obj) ] 它搜索视图 在项目的根目录中,而不是在特定区域的视图文件夹中。

我在这里错过了什么?

提前致谢。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-areas


    【解决方案1】:

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

    【讨论】:

    • 我遇到了类似的问题。在我的情况下,我的链接在路径中没有区域名称,即使调用了正确的控制器,也找不到视图。这种情况给我留下了控制器是如何被调用的问题。
    【解决方案2】:

    如果你使用代替

    context.MapRoute(
            "xyz_default",
            "xyz/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
    

    使用

    context.MapRoute(
            "xyz_default",
            "{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
    

    在你的

    xyzAreaRegistration.cs

    那么您无需在任何链接中明确指定您的区域...

    【讨论】:

    • 这种方法对我有用,但有另一个问题。路由命中了正确的控制器,但没有找到视图(它在主项目目录中查找默认视图,而不是在该区域中,这是我需要的)。
    • @jSideris 我也有同样的问题。你是怎么解决这个问题的?
    【解决方案3】:

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

    [RouteArea("Xyz", AreaPrefix = "")]
    public class XyzController : Controller   
    {
    ...
    }
    

    【讨论】:

      【解决方案4】:

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

      AreaRegistration.RegisterAllAreas();
      RegisterRoutes(RouteTable.Routes);
      

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

      未找到视图“索引”或其主视图。以下地点
        被搜索:
      
      ~/Areas/xyz/Views/Document/Index.aspx
      ~/Areas/xyz/Views/Document/Index.ascx
      ~/Areas/xyz/Views/Shared/Index.aspx
      ~/Areas/xyz/Views/Shared/Index.ascx
      
      ...然后是通常的根视图文件夹.. 

      ..如果它认为它在一个区域中,它将搜索的子目录的模式。

      【讨论】:

      • 这是在 VS2008 的 ASP.NET MVC 2 Web 应用程序中默认完成的。它是 global.asax 的默认设置的一部分
      • 嗨罗伯特,我重新检查了我所有的控制器命名空间。它们都与应有的 ProjectName.Areas.AreaName.Controllers 保持一致。
      • 您遇到的错误正是我所面临的。唯一的区别是我实际上在区域特定视图文件夹中存在相关视图
      • 也许你可以像这样在控制器中新建一个 RouteValueDictionary:System.Web.Routing.RouteValueDictionary routeData = RouteData.Tokens,设置一个断点,将鼠标悬停在 routeData 变量上,看看你是否得到一个带有值的 areaxyz?这将验证路线数据是否正确。
      • 我可以做一个redirecttoroute而不是redirecttoaction。
      【解决方案5】:

      MyAreaAreaRegistration.cs 检查生成的代码,并确保控制器参数设置为您的默认控制器,否则控制器将被称为 bot 由于某种原因 ASP.NET MVC 不会在区域文件夹中搜索视图

      public override void RegisterArea(AreaRegistrationContext context)
          {
              context.MapRoute(
                  "SomeArea_default",
                  "SomeArea/{controller}/{action}/{id}",
                  new { controller = "SomeController", action = "Index", id = UrlParameter.Optional }
              );
          }
      

      【讨论】:

      • 谢谢!这使用 ASP.NET MVC 5 脚手架为我修复了它。
      【解决方案6】:

      我刚刚遇到了同样的问题,并通过将 ascx 的“构建操作”属性设置为“嵌入式资源”来解决它。

      【讨论】:

        【解决方案7】:

        试试这个代码。更改区域注册文件...

        context.MapRoute(
            "YourRouteName",   // Route name //
            "MyAreaName/MyController/{action}",   // URL with parameters //
            new { 
                controller = "MyControllerName", 
                action = "MyActionName", meetId =  UrlParameter.Optional
             },   // Parameter defaults
            new[] { "Your Namespace name" }
        );
        

        【讨论】:

          【解决方案8】:

          对于那些正在寻找.net核心解决方案的人,请使用

           app.UseMvc(routes =>
              {
                routes.MapRoute(
                  name : "areas",
                  template : "{area:exists}/{controller=Home}/{action=Index}/{id?}"
                );
              });`
          

          如果您在主项目中有一些代码,而在区域中有一些代码,请使用以下代码。

          app.UseMvc(routes => {
                      routes.MapRoute(
                          name: "areas",
                          template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
          
                      routes.MapRoute(
                          name: "default",
                          template: "{controller=Home}/{action=Index}/{id?}");
                  });
          

          请注意确保您在控制器中定义了区域

           [Area("Test")]
          public class TestController : Controller
          {
              public IActionResult Index()
              {
                  return View();
              }
          }
          

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-12
            • 1970-01-01
            • 2011-10-09
            • 1970-01-01
            • 2012-10-06
            • 1970-01-01
            相关资源
            最近更新 更多