4

(我一口气发布并回答了这个问题,因为我花了一个小时才弄清楚这一点 - 我希望它会帮助其他人)

更新 - 我还在Asp.Net MVC Codeplex 问题板上发布了一个问题,以防您受到此问题的影响并且您想投票支持修复。MVC 工具的代码不是开源的,因此我们不能简单地提交一个拉取请求来进行非常简单的修复。

我们已经升级了一个大型 Web 表单站点以包含 MVC 4,并且我们打算在可预见的将来并排运行这两个部分(有一个庞大的 Web 表单代码库,所以它不能只是快速转换)。

对于 MVC 方面,我们打算将R​​azor 用于我们的视图。我们最初还将在区域下运行 MVC 代码,因为我们已经有一个复杂的专有路由引擎,可以为 web 表单方面重写 url。

在项目文件和 web.config 中执行了正确的步骤后,我们已经能够很好地运行它,但是有一个小问题。

每当我们在加载项目后第一次执行“添加视图”时,ASPX始终是选定的视图引擎。为了避免混淆,我们确实需要默认为 Razor。

我查看了如何使 razor 成为现有项目中的默认视图引擎,并将我的项目升级到 Razor 视图引擎,但 VS2010 仍然自动生成 WebForms;而且我们在项目中确实有 Razor 视图 - 所以它不能像在项目中至少有一个 Razor 视图那么简单。

4

1 回答 1

4

关于如何使剃刀成为现有项目中的默认视图引擎的公认答案只说明了一半。

正如我在问题中建立的那样——我们在项目中确实有剃刀视图——但事实证明,你需要~/Views在项目中有一个文件夹才能启动这个逻辑。在我们的例子中,我们使用所有 MVC 的区域4+ 代码,所以我们没有费心创建~/Views文件夹。

我反映了 Asp.Net MVC VS 扩展的“添加视图”对话框 - 在 Microsoft.VisualStudio.Web.Mvc.UserInterface.MvcAddViewDialog.Init方法中(我添加了对此代码的分析中的注释),您可以找到在首次显示对话框时选择默认视图引擎的代码:

//find the project's Views folder
ProjectItem viewsFolder = MvcProjectUtil.GetViewsFolder(this.Project);
//if not found, or if a view engine is already cached then skip this
if (viewsFolder != null && string.IsNullOrWhiteSpace(viewEngineName))
{
  //has razor views?
  bool flag = false;
  //has webforms views?
  bool flag2 = false;
  //scan all folders and files in the project, looking at all file extensions
  //if .cshtml or .vbhtml are found, then flag==true
  //if .aspx are found, then flag2 == true
  //both can be true when this method returns.
  this.GetViewTypes(viewsFolder.ProjectItems, ref flag, ref flag2);
  //if there's at least one razor view, or if there are no webforms views
  if (flag || !flag2)
  {
    //assign either C# or VB razor view type
    viewEngineName = ((this.Project.Kind == 
      "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") ? "VBHTML" : "CSHTML");
  }
}
//this'll get bound in the combo on the dialog
this.ViewEngineName = viewEngineName;

如您所见,视图类型的扫描仅在~/Views文件夹上进行 - 它不会费心寻找区域。

我们所要做的就是添加一个空~/Views文件夹(尽管我们也复制了 Web.Config 以添加 404 处理程序),并且在下一次重新加载项目时,Razor 会在下拉列表中自动选择。这是因为,正如在上述 SO 上接受的答案中正确描述的那样,如果找到剃刀视图或在该文件夹中找不到 webforms 视图,则使用 Razor。

于 2013-02-14T11:04:05.330 回答