我一直在将我的一些web应用整合到一个主要的ASP.NET MVC项目中;将其中的一些分配给不同的区域,以便可以通过子域访问它们。ASP.NET MVC Area可以显示自己的一组错误页面吗?
使用这个(很有用)资源(https://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging),我已经设置了在Web.config
customErrors
和httpErrors
,使显示的自定义错误页。效果很好。
我会为每个区域/子域使用不同的布局/样式,所以我想知道: 如何让Area显示自己的一组错误页面?
在当前的设置中,所有子域将显示主组被加入到customErrors
和httpErrors
切片(403.html,404.html,等等)的自定义错误的;但我宁愿为某些子域定制错误页面。 (如果地区之一只能由一个单独的域处理完全,例如,它是不实际的服务于普通的错误页面。)
更新: 下面是这种情况,与代码,请求。感谢Ben Foster,他在这里提供了很好的指导:http://benfoster.io/blog/aspnet-mvc-custom-error-pages2。我已经把customErrors的代码,但不是相应的httpErrors,为简洁起见而放弃它。
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
<error statusCode="404" redirect="~/404.aspx" />
<error statusCode="500" redirect="~/500.aspx" />
</customErrors>
</system.web>
<location path="MyArea1">
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Areas/MyArea1/500.aspx">
<error statusCode="404" redirect="~/Areas/MyArea1/404.aspx" />
<error statusCode="500" redirect="~/Areas/MyArea1/500.aspx" />
</customErrors>
</system.web>
</location>
<location path="MyArea2">
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Areas/MyArea2/500.aspx">
<error statusCode="404" redirect="~/Areas/MyArea2/404.aspx" />
<error statusCode="500" redirect="~/Areas/MyArea2/500.aspx" />
</customErrors>
</system.web>
</location>
上面的代码工作得很好:
- 如果我浏览到 “example.com/does/not/exist”,我在
~/404.aspx
得到 预期的错误页面。 - 如果我导航到“example.com/MyArea1/does/not/exist”,我会 得到
~/Areas/MyArea1/404.aspx
的自定义错误页面。
挑战:
现在我想的区域(MyArea2)要由一个完全独立的域(例如exampleOnMyOtherDomain.com)使用HostDomainConstraint
(所推荐的@TetsuyaYamamoto服务,在评论下面)。通过“example.com/MyArea2/validlink”访问的链接现在将以这种方式访问:“exampleOnMyOtherDomain.com/validlink”。
现在,如果我尝试“exampleOnMyOtherDomain.com/does/not/exist”,我将服务于顶级404(~/404.aspx
)。这可能是因为“MyArea2”不在路径中,所以路径“MyArea2”的位置不会被拾取。
我怎样才能让Area(MyArea2)服务自己的错误页面?
可能的位置设置可能有所帮助,请参阅参考:https://msdn.microsoft.com/en-us/library/ms178692.aspx。它可以在每个位置的''元素中包含不同的内容,允许通过指定区域相对路径为不同的区域设置'customErrors'和'httpErrors'。 –
谢谢@TetsuyaYamamoto;这是一个非常有用的评论。我尝试了'location'元素,当我的Areas是我主域的子路径(例如http://example.com/MyArea)时,'location'元素工作得很好('path =“MyArea”')!但问题在于:当我的区域完全由单独的域提供服务时,我无法使用相同的策略(例如http://myotherexample.net)。 – cyrotello
访问myotherexample.net时显示什么样的错误?可能它需要在Global.asax路由模块中使用'HostNameContraint'进行额外的路由配置(也包括对该区域的URL重写)。此外,您可以编辑您的问题以包含区域和路由代码。 –