【问题标题】:ASP.NET MVC doesn't find view in areaASP.NET MVC 在区域中找不到视图
【发布时间】:2011-07-29 11:10:29
【问题描述】:

我请求一个区域内的操作。路线是正确的,所以调试器进入了行动。如果我在操作中访问 RouteData 属性,我会看到控制器、操作和区域名称(因此设置了区域键)。但是在视图渲染期间,我得到一个异常,告诉我找不到视图(它只在根级视图中搜索,而不是在区域内)。但如果我明确指定视图名称,它就可以工作。

所以问题是如何让它隐式工作?

更新1 这是我的项目结构中 Watches 中 RouteData 的屏幕截图:

更新2 这是异常的文本:

未找到视图“Battles”或其主视图或没有视图引擎 支持搜索的位置。以下位置是 搜索:~/Views/AdminBattles/Battles.aspx ~/Views/AdminBattles/Battles.ascx ~/Views/Shared/Battles.aspx ~/Views/Shared/Battles.ascx ~/Views/AdminBattles/Battles.cshtml ~/Views/AdminBattles/Battles.vbhtml ~/Views/Shared/Battles.cshtml ~/Views/Shared/Battles.vbhtml

【问题讨论】:

  • 您能发布您的路线、控制器名称和视图路径吗?
  • 这是一个糟糕的问题,几乎无法回答。如果不固定,我将投反对票。
  • 这里是全尺寸截图的网址:i.stack.imgur.com/WDiwt.png
  • 我遇到了同样的问题,但我通过创建自定义视图引擎并定义要查看的区域来解决它。
  • @Phil,您能详细介绍一下吗?

标签: .net asp.net-mvc


【解决方案1】:

对不起,是我的错。我注册了调用context.Routes.MapRoute()而不是context.MapRoute()方法的区域路由。

【讨论】:

    【解决方案2】:

    伊萨,

    您可能会发现我今天遇到的一个类似问题(我想通了)可能会有所帮助:

    goin back to my 'routes' - issue with partialviews and areas??

    基本上,在您的视图 web.config 文件中,引用与站点的根或区域部分直接相关的命名空间。

    在一个非常相似的错误场景中为我工作。

    [edit] - 重新自定义视图引擎。只需将以下类添加到您的模型文件夹(当然使用您自己的自定义路径):

    using System.Linq;
    using System.Web.Mvc;
    
    namespace ABC.Web.Site.Areas.Administration.Models
    {
        public class ABCViewEngine : WebFormViewEngine
        {
            private static readonly string[] NewPartialViewFormats = 
                new[] {
                        "~/Areas/Administration/Views/Shared/Full/{0}.aspx",
                        "~/Areas/Administration/Views/Shared/Partial/{0}.ascx"
                      };
    
            public ABCViewEngine()
            {
                base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
            }
        }
    }
    

    然后将以下内容添加到您的 global.asax (Application_Start()):

    ViewEngines.Engines.Add(new ABCViewEngine());
    

    祝你好运..

    【讨论】:

    【解决方案3】:

    您是否在 Views 下创建了一个与您的控制器同名的文件夹(没有 Controller 位)并将您的视图放在那里?

    所以,不是:

    Areas
        AreaName
            Views
                MyView.aspx
    

    但是……

    Areas
        AreaName
            Views
                ControllerNameWithoutControllerOnTheEnd
                    MyView.aspx
    

    【讨论】:

    • 是的,我创建了这个文件夹。但是你可以在我上面放的截图上看看
    【解决方案4】:

    搜索往往会把人们带到这里,所以我想分片另一个相关项目。

    我遇到了 视图不会返回的问题,原因是 我本打算调用的重载方法出现意外的不匹配,而实际方法签名匹配

    例如,如果您将 Id 作为字符串,则 View("Something",id) 将匹配期望字符串 ViewName 和字符串 MasterName 的重载...

    不是:

    return View("Something",id);
    

    我的建议是,如果你提供参数名称,它可以更清楚,并解决这个问题

    但是:

    return View(viewName:"Something", model: id);
    

    这些类型的问题也可能发生在 HTML Helper 方法中,您通常只是希望能够传入您的模型,但如果您的模型只是一个字符串,您可能会匹配一些其他重载方法签名。 (例如,Action 链接 html 帮助程序。)

    因此,我建议只指定参数名称,并避免意外。哎呀,它甚至可能使您对代码的期望更加清晰。

    【讨论】:

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