Search code examples
asp.net-mvcasp.net-mvc-3html-helper

How to define view-level variables in ASP.NET MVC?


I have a cshtml partial view (Razor engine) that is used to render something recursively. I have two declarative HTML helper functions defined in this view and I need to share a variable between them. In other words, I want a view-level variable (not function-level variable).

@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);
    }
}

Solution

  • You can't do this. You will need to pass them as arguments to your helper functions:

    @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);
        }
    }