以下のリンクから、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
ファイルのベースタイプを変更し、修正しました。
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>
更新:
ステップバイステップのセットアップ:
カスタムベースビューを追加します。
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()
{
}
}
}
~/Views/web.config
にpageBaseType
属性を設定します(~/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>
~/Views/Home/Index.cshtml
内でプロパティを使用します:
<div>
@MyProperty
</div>
ヒット Ctrl+F5 アプリケーションを実行し、すべてがうまくいくと、Hello World
で迎えられます。
あなたが抱えている問題は、VIEWSフォルダのweb.configファイルを変更する必要があるためです。したがって、基本的にこの行:
<pages pageBaseType="[MyNamespace].WebViewPageBase">
メインプロジェクトのweb.configではなく、viewsフォルダーのweb.configにある必要があります。ダリン・ディミトロフの答えはそれを明確に示していますが、人々は通常その詳細を見落としています。私はその一人だったので知っています。実際、PhilHaackの記事もそうです...