Изменение типа базового вида на 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
на всех страницах?
РЕШИТЬ:
web.config
файл в каталоге root
неверен. Я изменил базовый тип в файле web.config
в каталоге View
и исправил его.
Ответы
Ответ 1
Почему вы показали две версии WebViewPageBase
: generic и non-generic?
Вам нужна только общая версия:
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>
UPDATE:
Пошаговая настройка:
- Создайте новое приложение ASP.NET MVC 3 с помощью шаблона Интернета
-
Добавить пользовательский базовый вид:
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()
{
}
}
}
-
Установите атрибут 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>
-
Внутри ~/Views/Home/Index.cshtml
используйте свойство:
<div>
@MyProperty
</div>
-
Нажмите Ctrl+F5, чтобы запустить приложение, и если все будет хорошо, вас встретит Hello World
.
Ответ 2
Проблема, с которой вы сталкиваетесь, заключается в том, что вам необходимо изменить файл web.config папки VIEWS. Итак, в основном эта строка:
<pages pageBaseType="[MyNamespace].WebViewPageBase">
должен находиться в файле web.config из вашей папки просмотра, а не в основном проекте web.config. Ответ Дарина Димитрова четко указывает на это, но люди обычно не замечают этой детали. Я знаю, потому что я был одним из них. На самом деле статья Фила Хаака...