23

以下のリンクから、MVC の基本ビュー タイプの変更に関する投稿を読みました。

http://haacked.com/archive/2011/02/21/changeing-base-type-of-a-razor-view.aspx

指示に従いましたが、私のページはまだ を継承していSystem.Web.Mvc.WebViewPageます。カスタム ビュー ベースで定義されたプロパティにアクセスできず、実行時にエラーが発生します。@inheritsキーワードを使用すると修正されます。

Web.config

<pages pageBaseType="[MyNamespace].WebViewPageBase">
  <namespaces>
    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
  </namespaces>
</pages>

WebViewPageBase

public class WebViewPageBase : WebViewPage
{
    public SomeType MyProperty { get; set; }

    public override void InitHelpers()
    {
        base.InitHelpers();
        MyProperty = { foo };
    }

    public override void Execute()
    {

    }
}


public class WebViewPageBase<T> : WebViewPage<T>
{
    public SomeType MyProperty { get; set; }

    public override void InitHelpers()
    {
        base.InitHelpers();
        MyProperty = { foo };
    }

    public override void Execute()
    {

    }
}

部分図

@model TopMenuModel

<div class="topMenu">
@MyProperty
</div>

しかし、私が読んだ投稿には、@inheritsキーワードに関する指示はありません。私が見逃しているもの、または@inheritsすべてのページでキーワードなしでこれを機能させる方法はありますか?

解決済み:

web.configディレクトリ内のファイルrootは正しいものではありません。web.configディレクトリ下のファイルのベースタイプを変更したViewところ、修正されました。

4

2 に答える 2

29

なぜ、WebViewPageBaseジェネリックと非ジェネリックの 2 つのバージョンを示したのですか?

ジェネリック バージョンのみが必要です。

public class MyWebView<T> : WebViewPage<T>
{
    public SomeType MyProperty { get; set; }

    public override void InitHelpers()
    {
        base.InitHelpers();
        MyProperty = new SomeType();
    }

    public override void Execute()
    {
    }
}

その後:

<pages pageBaseType="MvcApplication1.WebViews.MyWebView">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
  </namespaces>
</pages>

これで、ビュー内でプロパティを使用できるようになります:

@model TopMenuModel

<div class="topMenu">
    @MyProperty
</div>

アップデート:

ステップバイステップのセットアップ:

  1. インターネット テンプレートを使用して新しい ASP.NET MVC 3 アプリケーションを作成する
  2. カスタム ベース ビューを追加します。

    namespace MvcApplication1
    {
        public class MyWebView<T> : WebViewPage<T>
        {
            public string MyProperty { get; set; }
    
            public override void InitHelpers()
            {
                base.InitHelpers();
                MyProperty = "Hello World";
            }
    
            public override void Execute()
            {
            }
        }
    }
    
  3. pageBaseType属性を設定します~/Views/web.config( と混同しないでください~/web.config):

    <pages pageBaseType="MvcApplication1.MyWebView">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
    
  4. 内部~/Views/Home/Index.cshtmlでプロパティを使用します。

    <div>
        @MyProperty
    </div>
    
  5. ヒットCtrl+F5してアプリケーションを実行し、すべてがうまくいけば、Hello World.

于 2013-01-16T12:36:46.643 に答える
6

あなたが抱えている問題は、VIEWS フォルダーの web.config ファイルを変更する必要があるためです。したがって、基本的にこの行:

 <pages pageBaseType="[MyNamespace].WebViewPageBase">

メイン プロジェクトの web.config ではなく、views フォルダーの web.config にある必要があります。ダリン・ディミトロフの答えはそれを明確に示していますが、人々は通常、その詳細を見落としています。私もその一人だったので知っています。実際、Phil Haack の記事もそうです...

于 2013-02-27T22:02:51.430 に答える