(我一次性发布并回答这个问题,因为我花了很多时间来解决这个问题 - 我希望它能帮助其他人)
更新 - 我还posted an issue on the Asp.Net MVC Codeplex Issues board,如果您受此影响,并且您想投票支持修复。 MVC工具的代码不是开源的,所以我们不能简单地提交一个拉动请求来解决这个问题。
我们已经升级了一个大型Web窗体站点以包含MVC 4,并且我们打算在可预见的未来并行运行这两个链(有一个庞大的Webforms代码库,所以它不能快速转换)。 / p>
对于MVC方面,我们打算仅使用 Razor作为我们的观点。我们还将在最初的区域下运行MVC代码,因为我们已经有一个复杂的专有路由引擎,它可以重写webforms方面的URL。
在项目文件和web.config中执行了正确的步骤后,我们已经能够很好地运行它,但是有一个琐碎的问题。
每当我们在加载项目后第一次执行“添加视图”时,ASPX 总是选定的视图引擎。为了避免混淆,我们确实需要默认使用Razor。
我查看了How to make razor the default view engine in existing project和I'm upgraded my project to Razor view engine, but VS2010 still auto-generates WebForms;我们在项目中有Razor视图 - 所以它不能像在项目中至少有一个Razor视图一样简单。
答案 0 :(得分:4)
How to make razor the default view engine in existing project上接受的答案只讲述了一半的故事。
正如我在问题中所确定的那样 - 我们在项目中确实有剃刀视图 - 但事实证明,你需要在项目中有一个~/Views
文件夹才能启动这个逻辑。在我们的例子中,我们'为我们所有的MVC 4+代码使用区域,因此我们没有打扰创建~/Views
文件夹。
我反映了Asp.Net MVC VS扩展的Add View对话框 - 在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。