Причуды Разделов Бритвы - PullRequest
3 голосов
/ 06 марта 2011

Мне было интересно, может ли кто-нибудь здесь пролить свет на некоторые вопросы, которые у меня возникали в последнее время о Бритве.

1) Я хотел разделить определение раздела на несколько частей? Зачем? Потому что я хотел.

К сожалению, использование @section "sectionname" дважды вызывало исключение.

Глядя вглубь источника Razor, я увидел, что Razor проверил, был ли раздел уже определен, и выдал исключение, если он уже был определен.

Поскольку Razor использует делегаты для визуализации разделов, я изменил код на использование Delegate.Combine (если раздел был определен ранее), и это сработало, теперь я смог создать раздел, который был объявлен дважды (или более) ,

2) Когда раздел определен в виде, но не отображается на странице макета, создается исключение. Я не видел элегантного решения, чтобы преодолеть это. Если я хочу использовать страницу просмотра с несколькими страницами макета ... Это своего рода проблема.

Глядя на источник (опять же), есть просто foreach, который проверяет, был ли отрисован каждый раздел, определенный в представлении, и затем выдает исключение, если раздел не был отрисован.

Я подумал о некоторых решениях (особенно в отношении моего второго вопроса, наследования от базового класса представления и раскрытия не визуализированных разделов на странице макета и выполнения некоторой обработки), но они кажутся ... как хаки. Есть ли лучшие решения, чем изменение источника?

Не очень важно, но если у кого-то есть понимание конструктивных решений, которые привели Razor к такому решению, я также был бы признателен, так как это кажется очень ограничительным дизайном.

обновление

@ davidferguson и @takepara, вы ошиблись. Моя проблема не в определении раздела в макете и не в его определении в представлении, а в наоборот . Определение его в представлении, но не определение его в макете.

Ответы [ 3 ]

5 голосов
/ 24 марта 2011

1) К сожалению, это было дизайнерское решение, принятое на ранней стадии продукта, поскольку существуют огромные проблемы, связанные с объединением разделов и в каком порядке.Не говоря о том, что мы не можем этого сделать, но с учетом временных рамок просто невозможно поддерживать его как первоклассного гражданина во всех сценариях.

2) Это интересная идея.Там действительно нет хорошего решения, кроме как изменить исходный код.Тем не менее, я открыл проблему для функции для vNext, которая позволила бы для этого типа сценария.(Нет обещаний, что это сделает сокращение хотя)

5 голосов
/ 06 марта 2011

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

@RenderSection("sectionname", required: false)

с использованием этого, если какое-либо представление не реализует этот раздел, исключение не будет выдано.

1 голос
/ 06 марта 2011
...