ASP.NET MVC在区域中找不到视图

时间:2011-07-29 11:10:30

标签: .net asp.net-mvc

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

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

UPDATE1 这是我的项目结构中Watches中的RouteData的屏幕截图: enter image description here

UPDATE2 以下是例外文本:

  

未找到“战斗”或其主人视图或没有视图引擎   支持搜索的位置。以下地点是   搜索:〜/ 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   〜/查看/共享/ Battles.vbhtml

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

IDSA,

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

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

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

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

[edit] - 重新定制自定义视图。只需将以下类添加到Models文件夹中(当然还有自己的自定义路径):

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());
祝你好运..

答案 2 :(得分:2)

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

所以,不是:

Areas
    AreaName
        Views
            MyView.aspx

但是...

Areas
    AreaName
        Views
            ControllerNameWithoutControllerOnTheEnd
                MyView.aspx

答案 3 :(得分:0)

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

我遇到了视图无法返回的问题,因为重载方法的意外错过匹配我打算调用,而实际方法签名匹配

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

不会

return View("Something",id);

我的建议是,如果您提供参数名称

,它可以更清楚,并解决此问题

但相反:

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

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

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