0

教程的细节操作中,Scott 使用

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 视图?

有人请解释一下。

4

3 回答 3

0

当抛出 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 ..."
于 2010-02-15T22:51:02.553 回答
0

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

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

于 2010-02-15T22:36:02.650 回答
-2

这是 ASP.Net MVC 框架的约定之一。我强烈建议阅读一些关于框架约定的 ASP.Net MVC 教程和文档。这是 Views 上的那个

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

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

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

而不是通常的

<% Html.RenderPartial("SomeView") %>
于 2010-02-15T22:47:37.510 回答