【问题标题】:ASP.NET MVC - Custom Controller Factory to serve 404 PagesASP.NET MVC - 为 404 页提供服务的自定义控制器工厂
【发布时间】:2011-05-12 08:36:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我不知道你是如何为它实现自定义控制器工厂的,但是当有人告诉你如何实现时我想要它:P
  • 真的@Daniel White?这就是我链接到的问题,因为这是我提出的问题。您是否阅读过这个问题,因为我解释了为什么我会这样问?

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


【解决方案1】:

我不明白

编写一个自定义控制器工厂实际上是不是工作量更大而不是拥有一个额外的控制器来处理 404 的一个操作?

如果您有某种 GeneralController 来处理应用程序范围的功能(如设置或类似功能),那么此操作无论如何都可以成为其中的一部分。

所以。控制器工厂和控制器之间的哪一个:

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

敏捷开发人员在过度工程方面应该非常懒惰。

【讨论】:

  • 所以你是说 MVC 的核心是有一个毫无意义的控制器和一个毫无意义的视图文件夹和一个毫无意义的视图都只是为了提供静态内容视图?不仅如此,由于我目前使用的这种毫无意义的方法,我还必须拥有“重复”视图(它们是相同的)?而不是我的想法,它只是构建一个CustomControllerFactory 并重用共享文件夹中的现有视图。这对我来说没有意义。
  • 为什么会有重复的视图?如果你有一个控制器,你总是可以指向同一个视图。为什么要重复?
  • 因为如果视图不存在,MVC 会抛出 500 错误。因此,为了满足要求,我必须在 Errors 文件夹中有一个“空白”视图。因此,我为什么要尝试覆盖默认的 ControllerFactory。
【解决方案2】:

这应该很有帮助...

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 视图你会遇到麻烦。您会发现很多东西(例如 this.Html)可能没有正确设置。

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

最后,您可能想要使用不同的重定向模式...

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

...这样您的 404 网址就是所请求页面的网址。

【讨论】:

  • 不是真的。对于错误,这仍然需要Controller。我正在努力避免这一切。以我想要的方式去做可能是“更多的工作”,但我“认为”最终结果应该更干净。
  • 就是这样。我的/shared/notfound.vbhtml 文件是一个视图,我已经在很多代码中使用了它,并抛出了ResourceNotFoundError。我不想为了提供与其他任何地方相同的错误而将相同的文件复制/粘贴到 html 文件中。不幸的是,ResourceNotFoundError 在 Global.asax 中的 Application_Error 方法中不起作用,因为该错误发生在 MVC 接触请求之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多