0

My website has categories of posts (e.g. longreads, FAQs). I am trying to display a list of links to category pages twice: in the header and in the footer. So I have made a CategoryList : UserControl with a public List<Category>.

CategoryList.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CategoryList.ascx.cs" Inherits="WebApp.Controls.CategoryList" %>

<% foreach (WebApp.Data.Category c in Categories) // .CategoriesList.Categories.get returned null
{ %>
<span>
    <a href="<%= GetRouteUrl("category-view", new { category = c.CategorySlug }) %>">
        <%= c.CategoryName %>
    </a> <!-- e.g. <a href="/category/longreads">Longreads</a> -->
</span>
<% } %>

CategoryList.ascx.cs:

using System;
using System.Collections.Generic;

namespace WebApp.Controls
{
    public partial class CategoryList : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e) { }

        public List<Data.Category> Categories { get; set; }
    }
}

On the master page codebehind MainMaster.Master.cs I also have a List<Category> that is set during initialization like

public List<Category> Categories { get; } = Data.Categories.All.ToList();

Now in MainMaster.Master I try to display this control passing the list to it with an inline data-binding expression:

<%@ Register TagPrefix="custom" TagName="CategoryList" Src="~/Controls/CategoryList.ascx" %>
<!-- HTML form opening -->
    <custom:CategoryList Categories="<%# Categories %>" runat="server" />
<!-- HTML form closing -->

When I run this I get a NullReferenceException in CategoryList.ascx on the line

 foreach (WebApp.Data.Category c in Categories) // .CategoriesList.Categories.get returned null

Although when I try to do the same foreach loop on the page MainMaster.Master itself it works alright:

<!-- HTML form opening -->
<% foreach (WebApp.Data.Category c in Categories) // MainMaster.Categories
{ %>
    <span>
        <a href="<%= GetRouteUrl("category-view", new { category = c.CategorySlug }) %>">
            <%= c.CategoryName %>
        </a>
    </span>
<% } %>
<!-- HTML form closing -->

But I wouldn't like to repeat exactly the same code twice.
Is there a proper way I can pass a list to a user control?

1 Answer 1

1

Try assigning your categories in code behind, give the control an Id then reference it directly:

<custom:CategoryList runat="server" id="categoryList" />

You should be able to access it in your master page code behind:

categoryList.Categories = Data.Categories.All.ToList();

You will have to make sure depending on where you put this code, that your events fire in the correct order.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.