【问题标题】:On Website upgraded to MVC 4, add view dialog always defaults to ASPX在升级到 MVC 4 的网站上,添加视图对话框始终默认为 ASPX
【发布时间】:2013-01-30 04:00:42
【问题描述】:

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

更新 - 我也 posted an issue on the Asp.Net MVC Codeplex Issues board 以防您受到此影响并且您想投票支持修复。 MVC 工具的代码不是开源的,所以我们不能简单地提交一个拉取请求来进行非常简单的修复。

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

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

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

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

我看过How to make razor the default view engine in existing projectI'm upgraded my project to Razor view engine, but VS2010 still auto-generates WebForms;而且我们在项目中确实有 Razor 视图 - 所以它不能像项目中至少有一个 Razor 视图那么简单。

【问题讨论】:

    标签: c# asp.net asp.net-mvc visual-studio asp.net-mvc-4


    【解决方案1】:

    How to make razor the default view engine in existing project 上接受的答案只说明了一半。

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

    我反映了 Asp.Net MVC VS 扩展的“添加视图”对话框 - 在 Microsoft.VisualStudio.Web.Mvc.UserInterface.MvcAddViewDialog.Init 方法中(我已从我对此代码的分析中添加了 cmets),您会发现当对话框为时选择默认视图引擎的代码首次展示:

    //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。

    【讨论】:

    • 这太棒了。我已经有一个 Views 文件夹,但由于与您类似的原因,它没有包含在项目中(我的是一个类库,其中 .csproj 文件手动编辑了一点)。一旦我“显示所有文件”并包含空文件夹,一切正常。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2017-08-31
    • 2012-11-30
    相关资源
    最近更新 更多