我请求一个区域内的动作。路由是正确的,因此调试器进入操作。如果我在操作中访问RouteData属性,我会看到控制器,操作和区域名称(因此设置了区域键)。但在View渲染过程中,我得到一个异常,告诉无法查找视图(它只在根级视图中搜索,而不是在区域内搜索)。但是,如果我明确指定了视图名称,它就可以工作。
所以问题是如何让它隐含地工作?
UPDATE1 这是我的项目结构中Watches中的RouteData的屏幕截图:
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
答案 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助手。)
因此,我建议只指定参数名称,并避免意外。哎呀,甚至可能会让你对代码的期望更加清晰。