ASP.NET MVC - 自定义控制器工厂,提供404页面

时间:2010-11-18 23:09:26

标签: asp.net-mvc controller http-status-code-404

几天前我写了this question,虽然我得到了一些赞成,但我没有采取太多行动。这就是为什么我选择以新的方式重新访问这个问题。

我正在尝试将用户发送到我的NotFound视图,该视图位于我的共享目录中,只要他们请求控制器或不存在的操作。您会在上一个问题中看到我的own answer,这是一个有效的解决方案,但它仍然要求我拥有ErrorController/Error/NotFound.vbhtml视图。我认为这是相当荒谬的,因为我只是从该视图提供静态内容。

我想要做的是从共享目录渲染视图而不需要Controller。这就是我对自定义控制器工厂的想法所在......我只是不知道如何去做。

如何构建一个与默认控制器工厂完全相同的自定义控制器工厂,除非我需要显示NotFound视图(当然保持源URI完整)?

2 个答案:

答案 0 :(得分:1)

我不明白

编写自定义控制器工厂实际上更多工作,而不是使用一个处理404的操作的附加控制器?

如果你有某种GeneralController处理应用程序范围的功能(如设置或类似功能),那么无论如何这个动作都可以成为它的一部分。

因此。控制器工厂和控制器之间的哪一个:

  • 开发更耗时,
  • 更容易出错,
  • 更复杂,
  • 如果出现错误,
  • 会影响应用程序的较大表面吗?

在过度工程方面,敏捷开发人员应该非常讨厌。

答案 1 :(得分:0)

这应该有很多帮助...

How can I properly handle 404 in ASP.NET MVC?

......我建议你采用这种方法。

我认为你要做的事情很可能与ASP.NET MVC相悖,或者至少会引入一些对你的代码看起来不那么明显的东西。

您可以使用自定义错误来实现您想要的效果。在web.config中你可以做这样的事情......

    <customErrors mode="On" >
        <error statusCode="404" redirect="~/Views/Shared/NotFound.aspx" />
    </customErrors>

...但是因为这个aspx页面位于Views文件夹中,所以你必须进入位于Views文件夹中的web.config并阻止它直接访问视图。

如果此页面(NotFound.aspx)被写为MVC视图,那么您将遇到麻烦。你会发现许多东西(例如,这个。例如)可能没有正确设置。

鉴于您正在访问此文件,就好像它是经典的ASP.NET一样,您可能希望将其编写为经典ASP.NET,并将其置于Views文件夹之外。

最后,您可能希望使用其他重定向模式......

<customErrors mode="On" redirectMode="ResponseRewrite" >

...以便您的404网址是所请求网页的网址。