MVC3 Просмотр наследования невозможен? - PullRequest
11 голосов
/ 01 сентября 2011

Я хочу создать абстрактное базовое представление (с большим количеством виртуальных методов с помощью cshtml), а затем создать производное представление, которое необязательно переопределяет эти методы для настройки представления:

, например:

override void Header(string title) {
 <div class="massive">@title</div>
}

Как этого можно добиться с помощью бритвы?

(не все хотят / должны это делать?)

Ответы [ 4 ]

7 голосов
/ 01 сентября 2011

Это не совсем так работает из коробки, хотя я уверен, что с некоторыми усилиями вы могли бы заставить это работать.

Вместо этого вы создаете макеты с определенными разделами , а затем извлекаете другие макеты из этих добавления новых разделов, если вам нужно.Затем представление объявит, какой макет он использует, через

@{
    Layout = "_Layout.cshtml" // app relative path to layout
}

и может предоставить разметку для любых разделов, если необходимо, используя

@section SectionName {
    <p>I'm markup to go into a section in the layout this view is using</p>
}

. Вы можете передавать данные через ViewData иили ViewBag, чтобы вы могли использовать их для передачи делегатов, если вы хотите это сделать.

В качестве альтернативы вы можете решить добавить методы расширения к HtmlHelper, UrlHelper или даже создать WebViewPage, производный от System.Web.Mvc.WebViewPage и добавить любые дополнительные свойства / методы в ваш производный тип, а затем установить его какpageBaseType в <system.web.webPages.razor> в web.config, используемом представлениями.

7 голосов
/ 01 сентября 2011

Полагаю, вам лучше использовать методы Helper, чем пытаться создать модель наследования для представлений.Используйте блог Скотта Гу для введения:

http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs

1 голос
/ 04 сентября 2011

Самый простой способ, который я нашел, - это использовать @helper, объявленный в App_Code, который принимает делегатов в качестве аргументов:

@helper Example(Func<int, HelperResult> fn1, Func<int, HelperResult> fn2) {
 <div>@fn1(100)</div>
 <div>@fn2(200)</div>
}

, а затем создает представление с вспомогательными функциями:

@helper Custom1(int x) { <span class="small">@x</span> }
@helper Custom2(int x) { <span class="big">@x</span> }

и затем вызовите общий помощник следующим образом:

@Example(Custom1, Custom2)

, и, если требуется, общий помощник может реализовать поведение по умолчанию, если делегат имеет значение null

, это намного сложнее, чем простая реализация производногопросмотр с несколькими переопределенными виртуальными помощниками - но, по крайней мере, он работает, строго типизирован и не использует динамический

1 голос
/ 01 сентября 2011

Просто используйте разделы и макеты . Вы должны определить макет, содержащий некоторое содержимое по умолчанию, в разделы, которые могут быть переопределены в дочерних представлениях. Вы можете использовать метод IsSectionDefined в макете, чтобы проверить, переопределяет ли дочерний вид этот раздел и, если нет, предоставить содержимое по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...