NerdDinner异常和自定义错误

时间:2010-02-15 22:28:49

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

在详情中的this教程中,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的,虽然在Dinners视图文件夹中确实存在NotFound.aspx。 web.config中也没有。

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

问题(要更清楚):为什么“抛出新的HttpException(404,message)”返回NotFound视图?

有人请解释。

3 个答案:

答案 0 :(得分:0)

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

更新:就像womp说的那样,问一个不明确的问题然后低估答案是非常不诚实的。我怀疑你澄清问题的答案是下载的教程使用FileNotFoundResult异常作为占位符,它意味着被NotFound视图替换。我快速搜索了我的NerdDinner解决方案,这是我在完成完整教程后留下的内容,并且FileNotFoundResult不会在任何地方使用。

答案 1 :(得分: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 ..."

答案 2 :(得分:-2)

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

基本上,当您调用控制器的View()方法时,它是显式必须在视图模板文件的路径中进行编码的快捷方式。惯例是框架将首先在控制器的View目录中查找视图模板,然后在共享目录中查找。在搜索模板时,它也足够智能地查找.aspx和.ascx扩展名。

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

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

而不是通常的

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