web-dev-qa-db-ja.com

MVC4でのベースビュータイプの変更

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

http://haacked.com/archive/2011/02/21/changing-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キーワードなしでこれを機能させるために私が見逃していることや方法はありますか?

解決済み:

rootディレクトリ内のweb.configファイルが正しくありません。 Viewディレクトリの下のweb.configファイルのベースタイプを変更し、修正しました。

22
Halil Ibrahim

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 MVC3アプリケーションを作成します
  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. ~/Views/web.configpageBaseType属性を設定します(~/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で迎えられます。

28
Darin Dimitrov

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

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

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

6
Marko