Как создавать вложенные ViewComponents в монорелью и недвижимости?

StackOverflow https://stackoverflow.com/questions/2777190

  •  03-10-2019
  •  | 
  •  

Вопрос

Меня попросили обновить меню на веб-сайте, который мы поддерживаем. Веб-сайт использует монорелью намотки замка и носильность как шаблон. В настоящее время меню отображается пользовательские подклассы ViewComponent, которые представляют элементы Li. На данный момент только один (горизонтальный) уровень, поэтому текущий механизм в порядке.

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

Что в настоящее время существует:

<ul>
    #component(MenuComponent with "title=Home" "hover=autoselect" "link=/")
    #component(MenuComponent with "title=Videos" "hover=autoselect")
    #component(MenuComponent with "title=VPS" "hover=autoselect" "link=/vps")                                   
    #component(MenuComponent with "title=Add-Ons" "hover=autoselect" "link=/addons")                    
    #component(MenuComponent with "title=Hosting" "hover=autoselect" "link=/hosting")                           
    #component(MenuComponent with "title=Support" "hover=autoselect" "link=/support")                           
    #component(MenuComponent with "title=News" "hover=autoselect" "link=/news")
    #component(MenuComponent with "title=Contact Us" "hover=autoselect" "link=/contact-us") 
</ul>

Можно ли иметь вложенный менюкумонтенцы (или новый подменцоспособный) что-то вроде:

<ul>
    #component(MenuComponent with "title=Home" "hover=autoselect" "link=/")
    #component(MenuComponent with "title=Videos" "hover=autoselect")
    #blockcomponent(MenuComponent with "title=VPS" "hover=autoselect" "link=/vps")                                  
        #component(SubMenuComponent with "title="Plans" "hover=autoselect" "link=/vps/plans")
        #component(SubMenuComponent with "title="Operating Systems" "hover=autoselect" "link=/vps/os")
        #component(SubMenuComponent with "title="Supported Applications" "hover=autoselect" "link=/vps/apps")
    #end
    #component(MenuComponent with "title=Add-Ons" "hover=autoselect" "link=/addons")                    
    #component(MenuComponent with "title=Hosting" "hover=autoselect" "link=/hosting")                           
    #component(MenuComponent with "title=Support" "hover=autoselect" "link=/support")                           
    #component(MenuComponent with "title=News" "hover=autoselect" "link=/news")
    #component(MenuComponent with "title=Contact Us" "hover=autoselect" "link=/contact-us") 
</ul>

Мне нужно нарисовать подменю (элементы UL и Li) внутри переопределенного метода рендера на меню, поэтому использование вложенных проводных компаний может не работать. Я хотел бы, чтобы способ хранить в основном декларативный метод создания меню, если вообще возможно.

Редактировать: Я могу использовать контекст. Я предполагаю, что Rende Sub Menus нужно как-то крюкнуть в тот же выход, что и родитель?

Это было полезно?

Решение

Мой оригинальный метод рендера выглядел как

public override void Render()
{
    var buffer = new StringBuilder();           
    var extraClass = _hoverState == MenuHoverState.Selected ? "class=\"Selected\"" : "";

    // Menu Item Start
    buffer.Append("<li><a href=\"" + ComponentParams["link"] + "\"" + extraClass + ">");

    // Menu Text
    buffer.Append(ComponentParams["title"]);

    // Menu Item End
    buffer.Append("</a></li>");                     
    RenderText(buffer.ToString());
}

Мне нужно было крюкнуть в контекст .Writer:

public override void Render()
{
    var buffer = new StringBuilder();           
    var extraClass = _hoverState == MenuHoverState.Selected ? "class=\"Selected\"" : "";

    // Menu Item Start
    buffer.Append("<li><a href=\"" + ComponentParams["link"] + "\"" + extraClass + ">");

    // Menu Text
    buffer.Append(ComponentParams["title"]);

    // Menu Item End
    buffer.Append("</a><ul class=\"subMenu\" style=\"display:none;\">");                        
    Context.Writer(buffer.ToString());
    Context.RenderBody(Context.Writer);
    Contet.Writer("</ul></li>");    
}

Другие советы

Я могу использовать Context.runderbody (), чтобы сделать вложенные просмотры комплимента деривитивы

В вашем методе рендеринга вы можете использовать что-то вроде

RenderView("header");
RenderBody();
RenderView("footer");

и, возможно, использование рендеры может быть полезно, чтобы иметь возможность переопределить некоторые части из шаблона, который вы используете компонент

if(HasSection("header")){
    RenderSection("header");
} else {
    RenderView("header");
}

Также возможно вертелю и изменить контекст:

for(var item in this.SubItems){
    PropertyBag["item"] = item;
    if(HasSection("item")){
        RenderSection("item");
    } else {
        RenderView("item");
    }
}

Все эти решения являются причудливыми, но я геюрию предпочитаю иметь ViewComponent, который занимает целевую конкретную ViewModel (скажем, иерархикаменменвевмодель) в качестве параметра и сохранить шаблонную логику простой, более простым в использовании, а выпускная настройка происходит

По крайней мере, для простых элементов управления (которые когда-то только заслуживают макроса или частичного в зависимости от ViewEngine).

В конце концов, концепции ViewComponent проиллюстрированы выше, все еще приятно иметь при управлении контролем, которым нужно больше настроек. Совету состоит в том, чтобы позаботиться о документировании логики рендеринга или сохранение его простым (<= 10 строк в методе рендера)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top