【问题标题】:Why does the MVC appends aspx to the view names为什么 MVC 将 aspx 附加到视图名称
【发布时间】:2017-07-10 17:09:23
【问题描述】:

在我的控制器中我定义了:

const string KList = "list.cshtml";

我调用 Action 方法:

public ActionResult All()
{
    var view = Empty();

    var model = new Model(); // some other code to get the model

    view = PartialView(KList, model);
    return view;
}

这里是视图:

我得到这个错误:

System.Web.HttpException: '执行处理程序的子请求时出错 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'。'

InnerException: InvalidOperationException:未找到局部视图“list.cshtml”或没有视图引擎支持搜索 地点。搜索了以下位置:

~/Views/Communication/list.cshtml.aspx

~/Views/Communication/list.cshtml.ascx

~/Views/Shared/list.cshtml.aspx

~/Views/Shared/list.cshtml.ascx

为什么要在视图文件中附加 aspx 和 ascx?

【问题讨论】:

  • 这里缺少一些东西,如果你调用return View(),它不会搜索“list”,除非你执行return View(KList)之类的操作。然后,您需要将KList 更改为“list”而不是“list.cshtml”。
  • @Alisson ,刚刚更正了。感谢您的指出。
  • 不客气,如果有帮助,我会回答更多细节。

标签: c# asp.net-mvc-4 razor


【解决方案1】:

视图引擎将获取您传递给View() 的参数,并在控制器的文件夹中查找具有相同名称、支持扩展名的文件,例如:

  • cshtml(剃须刀引擎的一部分)
  • aspx(ASPX 引擎)
  • ascx(用户控制)

因此,您不需要显式传递 View() 重载的扩展名,它将视图名称作为第一个参数。只需更改:

const string KList = "list.cshtml";

到

const string KList = "list";

我建议阅读 this article 解释两种视图引擎(Razor 和 ASPX)的区别。

【讨论】:

  • 所以即使我们提到一个,它也会附加所有文件扩展名?太蠢了
  • @SimpleFellow 是的,视图引擎遵循一个序列,直到找到匹配的序列。它开始在 Controller 的文件夹中查找,如果没有找到,它将在 Views 内的 Shared 文件夹中查找。
  • @SimpleFellow 如果您不喜欢它,请编写您自己的视图引擎。这并不难。
  • @SimpleFellow MVC 默认使用所有视图引擎。如果您不喜欢 global.asax.cs 中的 Application_Start 方法中的这种行为,请添加:ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());
  • @SimpleFellow 只要.cshtml 文件存在,它就不会继续寻找.aspx 和其他扩展名,这是不必要的。但是,如果在明显的文件夹(控制器的视图文件夹和共享文件夹)中找不到它,它会假设您正在尝试使用其他文件扩展名,这在同一个项目中使用很奇怪,但这是可能的并且有人们可能需要这个的情况(比如从 webforms 迁移到 MVC,但试图将一些 webform 页面与新的 mvc 项目保持在一起)。
猜你喜欢
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多