2015-05-19 2 views
3

Как написать функцию, которая будет использоваться на странице *.cshtml. Раньше мы использовали @helper или @function. как нам это сделать? Например, я хотел бы написать рекурсивную функцию для отображения всех значений конфигурации. Как я могу это сделать?Создать метод/функцию для использования в представлении

<dl> 
    @foreach(var k in config.GetSubKeys()) 
    { 
     <dt>@k.Key</dt> 
     <dd>@config.Get(k.Key)</dd> 
     @* TODO How can we make this a helper function/recursive? *@ 
     @foreach(var sk in config.GetSubKey(k.Key).GetSubKeys()) 
     { 
      <dt>@sk.Key</dt> 
      <dd>@config.Get(sk.Key)</dd> 
     } 
    } 
</dl> 

Я полагаю, что нам нужно добавить зависимость в project.json, а затем отказаться в использовании его в Startup.cs.

ответ

1

Ссылаясь на проект fewdiscussions, у нас есть только проблески онлайн, @helper был удален по соображениям дизайна; замена является View Components.

Я бы рекомендовал View компонент, который был похож на следующее:

public class ConfigurationKeysViewComponent : ViewComponent 
{ 
    private readonly IConfiguration config; 
    public ConfigurationKeysViewComponent(IConfiguration config) 
    { 
     this.config = config; 
    } 

    public IViewComponentResult Invoke(string currentSubKey = "") 
    { 
     return View(new ConfigurationData 
     { 
      Key = currentSubKey, 
      Value = config.Get(currentSubKey), 
      SubKeys = config.GetSubKey(currentSubKey).GetSubKeys().Select(sk => sk.Key) 
     }); 
    } 
} 

Ваш взгляд ViewComponent был бы тогда быть относительно просто:

<dt>@Model.Key</dt> 
<dd>@config.Get(Model.Key)</dd> 
@foreach (var sk in Model.SubKeys) 
{ 
    @Component.Invoke("ConfigurationKeys", sk) 
} 

Вы можете затем вызвать его из ваш вид корня выглядит следующим образом:

@Component.Invoke("ConfigurationKeys") 

Отказ от ответственности: я написал это в редакторе SO, могут быть ошибки компилятора. Кроме того, я не уверен, что View Components поддерживает параметры по умолчанию - вам может потребоваться добавить по умолчанию "" к вызову корневого представления к компоненту представления.

В качестве альтернативы, если это всего лишь отладочный код, вы можете развернуть свою рекурсию с помощью Stack<>.

0

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

Компонент Вид:

@model YourRecursiveDataStructure 
<ul class="sidebar-menu"> 
    <li class="header">MAIN NAVIGATION</li> 

    @foreach (var node in Model.RootNodes) 
    { 
     @Html.Partial("~/YourPath/RenderElement.cshtml", node) 
    } 
</ul> 

визуализация элемента в виде:

@model YourRecursiveNode 
<li> 
    <a href="@Model.Href"> 
     <span>@Model.Display</span> 
    </a> 
    @Html.Partial("~/YourPath/RenderChildren.cshtml", Model) 
</li> 

Затем дети элемента дерева петли в другом виде:

@model YourRecursiveNode 
@if (Model.HasChildren) 
{ 
    <ul> 
     @foreach (var child in Model.Children) 
     { 
      @Html.Partial("~/YourPath/RenderElement.cshtml", child) 
     } 
    </ul> 
} 
Смежные вопросы