Как прикрепить части содержимого только к определенным типам или определенным элементам содержимого?

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

1) Я хотел бы создавать настраиваемые части, которые можно прикреплять, но только к определенным типам контента, например, только к таксономиям. Было бы очень здорово, если бы это было возможно из коробки с помощью миграций, например, что-то вроде .Attachable(cfg => cfg.ToType("Taxonomy")), но я так не думаю.

В настоящее время, чтобы моя пользовательская часть не использовалась для контента, для которого она не предназначена, я просто пишу проверки в методах драйвера:

protected override DriverResult Editor(CustomPart part, dynamic shapeHelper)
{
    if (part.ContentItem.ContentType != "Taxonomy") return null;

    return ContentShape("Parts_Custom_Edit", ...
}

Это хороший способ сделать это? Будет ли обработчик лучше подходить для такой логики?

2) Точно так же я хотел бы иметь возможность условно прикреплять разные части к разным отдельным элементам контента. Например, я хотел бы, чтобы только родительские термины первого уровня в таксономии имели некоторые поля, а дочерние термины — некоторые другие.

Лучший способ, который я могу придумать в настоящее время, чтобы справиться с этим, — это просто создать одну часть, которая содержит все поля, и выполнить проверки, аналогичные приведенным выше, в его методах драйвера, чтобы вернуть разные модели в зависимости от его контейнера. Затем в представлении шаблона я проверяю, какие поля отображать:

@if (Model.ThisField != null) {
    <div>@Html.EditorFor(m => m.ThisField)</div>
}
else {
    <div>@Html.EditorFor(m => m.ThatField)</div>
}

В идеале я хотел бы создать одну присоединяемую часть, которая способна добавлять несколько неприсоединяемых вторичных частей к существующим элементам контента, когда он прикреплен к типу, и к новым элементам контента, когда они создаются или обновляются. Есть ли безболезненный способ сделать это? Я думаю, что «Сварка» может быть тем, что мне нужно, но я не смог найти никакой документации или руководств, которые могли бы объяснить сварку мне, как будто мне пять лет.


person Lawyerson    schedule 13.04.2016    source источник
comment
Хотите ли вы, чтобы они могли присоединяться к определенным типам или всегда присоединялись к определенным типам?   -  person devqon    schedule 13.04.2016
comment
Я хотел бы иметь возможность. В противном случае я мог бы сделать их неприсоединяемыми и прикрепить их при миграции. Однако в случае присоединения к определенным элементам содержимого, я полагаю, это всегда должно происходить программно.   -  person Lawyerson    schedule 13.04.2016
comment
Позже мне придется перечитать вашу проблему еще раз, но из того, что вы описываете, я думаю, что лучший способ сделать это - сварить части в обработчике контента. Вы правы, когда дело доходит до документации по сварке, я предлагаю вам просто пройтись по методу Weld‹TPart›(), чтобы понять, как он работает, это всего пара строк.   -  person Xceno    schedule 13.04.2016
comment
Спасибо @Xceno, я посмотрю на это.   -  person Lawyerson    schedule 15.04.2016


Ответы (1)


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

person ViRuSTriNiTy    schedule 26.04.2016
comment
Я посмотрел на ваш код, и он очень похож на то, что я имел в виду, хотя я не знал, с чего начать. Это кажется ужасно сложным для простой задачи, слишком сложным для требований проекта, вызвавшего мой вопрос, но я постараюсь в ближайшее время разобраться с этим в свободное время. - person Lawyerson; 27.04.2016