4

(これを理解するのにかなりの時間がかかったので、この質問を一度に投稿して回答しています-そしてそれが他の人に役立つことを願っています)

更新-この影響を受けて修正に投票したい場合に備えて、Asp.NetMVCコードプレックスの問題ボードにも問題を投稿しました。MVCツールのコードはオープンソースではないため、非常に単純な修正であるプルリクエストを単純に送信することはできません。

大規模なWebフォームサイトをアップグレードしてMVC4を追加しました。近い将来、2つのストランドを並べて実行する予定です(大規模なWebフォームコードベースがあるため、すぐに変換することはできません)。

MVC側では、ビューにRazorのみを使用する予定です。また、最初はエリアの下でMVCコードを実行します。これは、Webフォーム側のURLを書き換える複雑な独自のルーティングエンジンがすでにあるためです。

プロジェクトファイルとweb.configで正しい手順を実行したことで、すべてを正常に実行することができましたが、問題が1つあります。

プロジェクトのロード後に初めて「ビューの追加」を実行するときは常に、ASPXが常に選択されたビューエンジンです。混乱を避けるために、デフォルトでRazorである必要があります。

razorを既存のプロジェクトのデフォルトのビューエンジンにする方法を確認し、プロジェクトをRazorビューエンジンにアップグレードしましたが、VS2010は引き続きWebFormsを自動生成します。プロジェクトにはRazorビューがあります。したがって、プロジェクトに少なくとも1つの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で受け入れられた回答に正しく記載されているように、かみそりのビューが見つかった場合、またはそのフォルダーにWebフォームのビューが見つからなかった場合にRazorが使用されるためです。

于 2013-02-14T11:04:05.330 に答える