3

.cshtmlファイルでカスタム名前空間のモデルを使用しようとしています。ただし、モデルを設定しようとすると、RazorはThe type or namespace name could not be foundエラーをスローします。

以下に示すように、組織化を支援するためにソリューションフォルダーを使用するプロジェクトセットアップがあります。 MyProjectのFolderStructureを表示します

MyViewModel.csファイルのコードは次のようになります。

namespace MyProject.ViewModels
{
    public class MyViewModel
    {
    }
}

これが基本的なレイアウトです。問題は、Razorビューでオブジェクトを使用しようとするとMyViewModel、名前空間が見つからないとRazorが言うことです。ここに示されているように: Razorが名前空間を見つけることができません

私は自分がすべきことをすべてやっていると信じています。Razorがソリューションフォルダを調べていないようです。MyViewModelオブジェクトをRazorに認識させるにはどうすればよいですか?足りないものはありますか?

注意:@usingパス全体を参照するようにステートメントを変更するだけでよいことを認識しています。ただし、私のプロジェクトでは、ViewModelsフォルダー内に多くのソリューションフォルダーがあり、それぞれを調べて指定したくありません。

アップデート

質問にうまく答えたので、私はダリンの答えを受け入れました。また、私の特定の状況と、この質問が出た理由について、以下にいくつかの情報を提供しました。

私はこの問題をもう少し調べて、何が起こっているのかを理解しました。私は通常、次のようにビューモデルを参照できるSparkViewEngineを使用します。Razorが<viewdata model="ViewModels.MyViewModel"/>同じ方法でビューモデルを参照することを許可しなかったとき、Razorに何か問題があると思いました。

各ViewEngineは、ビューの生成を支援するために使用される一時CSファイルを作成します。Sparkによって作成された一時ファイルは、「controllers」名前空間を使用します。この場合、SparkはMyProject.Controllers一時的なCSファイルで名前空間を使用します。これはViewModels.MyViewModel、生成されたCSファイルと同じ名前空間にあるため、完全な名前空間を指定せずにオブジェクトを参照できることを意味します。

Razorによって生成される一時ファイルは、ASP名前空間を使用します。ViewModels.MyViewModelこれは、生成されたCSファイルと同じ名前空間にないため、完全な名前空間を指定せずにオブジェクトを参照できないことを意味します。

4

2 に答える 2

4

@usingディレクティブを使用して、ビューモデルが宣言されている名前空間をかみそりビューの上部に追加します。

@using MvcApplication1.ViewModels
@model MyViewModel

また、使用したいすべてのかみそりビューにこれを追加しないよう<namespaces>に、ファイルのセクションに追加することもでき~/Views/web.configます(と混同しないでください~/web.config)。

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />

        <add namespace="MvcApplication1.ViewModels" />
      </namespaces>
    </pages>
</system.web.webPages.razor>

また、完全な名前空間を指定した方法にも注目してください。使用しているように見えるスクリーンショットでViewModels.MyViewModelは、これが正しい名前空間であると確信していますか?通常、Visual Studioでクラスファイルを追加すると、アプリケーション名+フォルダーを使用して、のような名前空間のプレフィックスが付けられますMvcApplication1.ViewModels

于 2013-02-02T19:01:17.570 に答える
1

ディレクティブは@using名前空間を指す必要があります。

@using MyProject.ViewModels

次に、モデルをクラスとして宣言します。

@model MyViewModel

または、フルネームを直接使用します。

@model MyProject.ViewModels.MyViewModel
于 2013-02-02T19:00:44.947 に答える