33


8

  1. 新しいASP.NET MVC Webアプリケーションを作成します。

  2. ASP.NETのApp_Codeフォルダを作成する

  3. 新しいフォルダ内に、Extension Methodを使用してクラスを作成します。 例えば:

static public class BugMVCExtension {public static int ToInt(この文字列str){return Convert.ToInt32(str); }}
  1. ビューを選択して、この新しい拡張方法を使用してみてください

この例外が出ます:

CS0121:次のメソッドまたはプロパティ間の呼び出しがあいまいです。 '* MvcApplication1.App_code.BugMVCExtentions.ToInt(string)*'と '* MvcApplication1.App_code.BugMVCExtentions.ToInt(string)*'

これについての詳細な情報がありますか。 ASP.NET MVC(?)WebアプリケーションでApp_codeを作成するのは間違っていますか?

4 Answer


46


Visual Studioで作成されたMVCプロジェクトは、デフォルトでWebアプリケーションプロジェクトモデルを使用します。 `App_Code`は主にWebサイトモデルで使われています。 私はそれらの違いについて読むことをお勧めします( 別の質問でこれをカバーしていますそしてそれはまたMSDNで広くカバーされています)。 WebアプリケーションプロジェクトのソースファイルをApp_Codeに追加すると、Visual StudioはそれをDLLにコンパイルし(プロジェクトに含まれるため)、それを/ binに入れます。 実行時に、ASP.NETコンパイラは `App_Code`を見て、異なるアセンブリでソースをコンパイルしようとします。 結果として、同じ名前の2つの別々のクラスが2つの異なるアセンブリに存在することになり、ASP.NETパーサーが `.aspx`ファイルをコンパイルしようとするとき、1つを選ぶことができません。

更新:

これら2つ(拡張メソッドとインスタンス化しているクラス)は単一の.csファイルに含まれていますか? そうでなければ、おそらく、インスタンス化しているクラスが* Build Action (ファイルを右クリックしてプロパティをクリック)が Content に設定されたソースファイルにあります。他で参照することはできません .cs files that are outside App_Code but you’ll be able to use it in ビルドアクションが Compile *の場合、エラーになります。 この問題は間違いなく拡張メソッドに固有のものではありません。 Visual Studioは、 `App_Code`に追加されたソースファイルに対してデフォルトでContentに設定するのに十分賢いようです。


2


この問題を解決するために、WebアプリケーションのルートにあるApp_Codeフォルダーの外側に.csファイルを配置しました。


2


app_codeフォルダを使用しないでください。

他のフォルダ名を使用してください。 IEです。 appCodeまたはApplicationsCode。

フォルダ内の名前は、実行時にコードが重複してしまうことを意味します。


1


フォルダのフルネームスペースの拡張子のファイルに入れることで解決しました。

ネームスペースヘルパー\ {

名前空間xxx.yyy.zzz.Helpers \ {