Как определить переменные уровня представления в ASP.NET MVC? - PullRequest
5 голосов
/ 30 июня 2011

У меня есть частичное представление cshtml (движок Razor), которое используется для визуализации чего-либо рекурсивно.У меня есть две декларативные вспомогательные функции HTML, определенные в этом представлении, и мне нужно разделить переменную между ними.Другими словами, я хочу переменную уровня представления (не переменную уровня функции).

@using Backend.Models;
@* These variables should be shared among functions below *@    
@{
    List<Category> categories = new ThoughtResultsEntities().Categories.ToList();
    int level = 1;
}

@RenderCategoriesDropDown()

@* This is the first declarative HTML helper *@
@helper RenderCategoriesDropDown()
{
    List<Category> rootCategories = categories.Where(c => c.ParentId == null).ToList();
    <select id='parentCategoryId' name='parentCategoryId'>
    @foreach (Category rootCategory in rootCategories)
    {
        <option value='@rootCategory.Id' class='level-@level'>@rootCategory.Title</option>
        @RenderChildCategories(rootCategory.Id);
    }
</select>
}

@* This is the second declarative HTML helper *@
@helper RenderChildCategories(int parentCategoryId)
{
    List<Category> childCategories = categories.Where(c => c.ParentId == parentCategoryId).ToList();
    @foreach (Category childCategory in childCategories)
    {
        <option value='@childCategory.Id' class='level-@level'>@childCategory.Title</option>
        @RenderChildCategories(childCategory.Id);
    }
}

Ответы [ 2 ]

6 голосов
/ 30 июня 2011

Вы не можете сделать это. Вам нужно будет передать их в качестве аргументов своим вспомогательным функциям:

@using Backend.Models;
@{
    List<Category> categories = new ThoughtResultsEntities().Categories.ToList();
    int level = 1;
}

@RenderCategoriesDropDown(categories, level)

@helper RenderCategoriesDropDown(List<Category> categories, int level)
{
    List<Category> rootCategories = categories.Where(c => c.ParentId == null).ToList();
    <select id='parentCategoryId' name='parentCategoryId'>
    @foreach (Category rootCategory in rootCategories)
    {
        <option value='@rootCategory.Id' class='level-@level'>@rootCategory.Title</option>
        @RenderChildCategories(categories, level, rootCategory.Id);
    }
    </select>
}

@helper RenderChildCategories(List<Category> categories, int level, int parentCategoryId)
{
    List<Category> childCategories = categories.Where(c => c.ParentId == parentCategoryId).ToList();
    @foreach (Category childCategory in childCategories)
    {
        <option value='@childCategory.Id' class='level-@level'>@childCategory.Title</option>
        @RenderChildCategories(categories, level, childCategory.Id);
    }
}
0 голосов
/ 12 января 2017

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

@functions
{
    private int level = 0;
}
...