在升级到MVC 4的网站上,添加视图对话框始终默认为ASPX

本文关键字:对话框 视图 添加 ASPX 默认 MVC 网站 | 更新日期: 2023-09-27 17:59:32

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

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

我们已经升级了一个大型Web Forms网站,使其包含MVC 4,并打算在可预见的未来将这两个部分并行运行(有一个庞大的Web Forms代码库,因此不能快速转换)。

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

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

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

我已经研究了如何使剃刀成为现有项目中的默认视图引擎;m将我的项目升级为Razor视图引擎,但VS2010仍然自动生成WebForms;而且我们在项目中确实有Razor视图,所以它不能像在项目中至少有一个Razor那样简单。

在升级到MVC 4的网站上,添加视图对话框始终默认为ASPX

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

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

我反映了Asp.NetMVCVS扩展的AddView对话框-在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。