C# 在升级到MVC4的网站上,“添加视图”对话框始终默认为ASPX

C# 在升级到MVC4的网站上,“添加视图”对话框始终默认为ASPX,c#,asp.net,asp.net-mvc,visual-studio,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Visual Studio,Asp.net Mvc 4,(我发布并一次性回答了这个问题,因为我花了一个小时才弄明白这一点——我希望它能帮助其他人) 更新-我还提醒您,如果您受到此问题的影响,并且您想投票寻求解决方案,我也会提醒您。MVC工具的代码不是开源的,因此我们不能简单地提交一个拉取请求来获得一个非常简单的修复。 我们已经升级了一个大型Web表单站点,使其包含MVC4,并且我们打算在可预见的未来同时运行这两条线(有一个庞大的Web表单代码库,所以它不能很快转换) 对于MVC方面的事情,我们打算只使用Razor作为我们的视图。我们最初还将在area

(我发布并一次性回答了这个问题,因为我花了一个小时才弄明白这一点——我希望它能帮助其他人)

更新-我还提醒您,如果您受到此问题的影响,并且您想投票寻求解决方案,我也会提醒您。MVC工具的代码不是开源的,因此我们不能简单地提交一个拉取请求来获得一个非常简单的修复。

我们已经升级了一个大型Web表单站点,使其包含MVC4,并且我们打算在可预见的未来同时运行这两条线(有一个庞大的Web表单代码库,所以它不能很快转换)

对于MVC方面的事情,我们打算只使用Razor作为我们的视图。我们最初还将在areas下运行MVC代码,因为我们已经有了一个复杂的专有路由引擎,可以为webforms端重写URL

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

每当我们在加载项目后第一次“添加视图”时,ASPX始终是选定的视图引擎。为了避免混淆,我们真的需要在默认情况下使用它

我看了又看;我们在项目中确实有Razor视图,因此它不能像在项目中至少有一个Razor视图那样简单。

关于的公认答案只说明了一半

正如我在问题中所确定的那样——我们在项目中确实有razor视图——但事实证明,您需要在项目中有一个
~/views
文件夹才能启动此逻辑。在我们的例子中,所有MVC4+代码都使用了区域,因此我们没有创建
~/Views
文件夹

我反映了Asp.Net MVC VS extension的“添加视图”对话框-在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的公认答案中正确描述的那样,如果在该文件夹中找到Razor视图或找不到webforms视图,则使用Razor。

这太棒了。我已经有了一个Views文件夹,但由于与您类似的原因,它没有包含在项目中(我的是一个类库,其中.csproj文件手动编辑了一点)。一旦我“显示了所有文件”并包含了空文件夹,一切都很好。谢谢