【问题标题】:NerdDinner exceptions and custom errorsNerdDinner 异常和自定义错误
【发布时间】:2010-02-15 22:28:48
【问题描述】:

this 教程中斯科特使用的细节操作

if (dinner == null) 
return View("NotFound");        
else
return View("Details", dinner); 

返回 404 Not Found 消息视图。

但在我下载的 NerdDinner 源代码中,有以下几行:

        if (dinner == null) {
            return new FileNotFoundResult { Message = "No Dinner found for that id" };
        }

这转到 FileNotFoundResult 那里有这个:

public class FileNotFoundResult : ActionResult
{
    public string Message { 
        get; 
        set; 
    }

    public override void ExecuteResult(ControllerContext context) {
        throw new HttpException(404, Message);
    }
}

就是这样。从这里开始对 NotFound.aspx 视图的引用是如何产生的?我无法找到它是如何映射到 NotFound.aspx 的,尽管 NotFound.aspx 确实存在于 Dinners 视图文件夹中。 web.config 中也没有任何内容..

以上代码来自 Change Set 41262 而非 1.0 版本。

问题(更清楚一点):“throw new HttpException(404, message)”怎么会返回 NotFound 视图??

请有人解释一下。

【问题讨论】:

    标签: asp.net asp.net-mvc nerddinner


    【解决方案1】:

    当抛出 HttpException 时,它最终会被 asp.net 运行时捕获,后者将通过提供错误页面来处理它。这个错误页面可以在 customErrors webConfig 选项中自定义

    <customErrors mode="RemoteOnly" defaultRedirect="/Dinners/Trouble">
                <error statusCode="404" redirect="/Dinners/Confused"/>
    

    您确定它仍在加载 NotFound.aspx 页面,而不是 Confused.aspx?

    "Sorry - but the dinner you requested doesn't exist or was deleted."
    

    而不是

    "Are you lost? Try taking a look at the complete list of ..."
    

    【讨论】:

    • This is from NotFound.aspx: "

      Lost?

      抱歉 - 但您请求的晚餐不存在或已被删除。

      " 这是来自 Confused.aspx:“

      Confused?

      你迷路了吗?试着看看即将到来的晚餐的完整列表。

      “所以不,它正在渲染 NotFound.aspx 这就是我问的原因,因为它不在 Web.config 或其他任何地方..
    【解决方案2】:

    我下载时 Views\Dinners 文件夹中有一个 NotFound.aspx 视图。

    更新:就像 womp 所说,提出一个不清楚的问题然后否决答案是非常不诚实的。我怀疑您已澄清问题的答案是下载的教程使用 FileNotFoundResult 异常作为占位符,它应该被 NotFound 视图替换。我快速搜索了我的 NerdDinner 解决方案,这是我在完成完整教程后留下的,并且 FileNotFoundResult 没有在任何地方使用。

    【讨论】:

    • 是的,正如我所说,有 NotFound.aspx 但我不知道如何建立连接/引用..
    • 请下载最新的代码(41262),你应该在那里找到它。 FileNotFoundResult 自定义 ActionResult 的方式使我们能够使用 View 返回 HTTP 状态代码,在本例中为 404。1.0 版不这样做。
    【解决方案3】:

    这是 ASP.Net MVC 框架的约定之一。我强烈建议阅读一些关于框架约定的 ASP.Net MVC 教程和文档。 Here's the one on Views.

    基本上,当您调用控制器的View() 方法时,它是一种快捷方式,用于显式地在视图模板文件的路径中进行编码。约定是框架将首先在控制器的 View 目录中查找视图模板,然后在 Shared 目录中查找。它也很聪明,可以在搜索模板时同时查找 .aspx 和 .ascx 扩展名。

    这就是为什么如果你想加载一个不在这两个文件夹中的视图,你必须更加明确。例如,要加载不在当前控制器的 View 文件夹中的局部视图,您必须指定它的完整路径:

    <% Html.RenderPartial("~/Views/SomeOtherController/SomeView.ascx") %>
    

    而不是通常的

    <% Html.RenderPartial("SomeView") %>
    

    【讨论】:

    • 这根本不是他要问的问题
    • 有这么多错误的答案,也许你需要澄清你的问题。事实上,反对票几乎阻止了我进一步尝试理解和帮助您的任何动力。
    • 我使用 MVC 已经 6 个月了,你不必解释显而易见的事情。并指示我去与它无关的教程。为了回答而回答......顺便说一句,我现在已经编辑了我的问题
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2019-07-11
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多