在详情中的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视图?
有人请解释。
答案 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") %>