ASP.NET Web 窗体:如何将列表传递给用户控件?
ASP.NET Web Forms: How can I pass a list to a user control?
我的网站有帖子类别(例如长篇文章、常见问题解答)。
我试图两次显示指向类别页面的链接列表:在页眉和页脚中。
所以我做了一个 CategoryList : UserControl
和 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; }
}
}
在母版页代码隐藏 MainMaster.Master.cs
我也有一个 List<Category>
是在初始化期间设置的
public List<Category> Categories { get; } = Data.Categories.All.ToList();
现在,在 MainMaster.Master
中,我尝试显示此控件,并使用内联数据绑定表达式将列表传递给它:
<%@ Register TagPrefix="custom" TagName="CategoryList" Src="~/Controls/CategoryList.ascx" %>
<!-- HTML form opening -->
<custom:CategoryList Categories="<%# Categories %>" runat="server" />
<!-- HTML form closing -->
当我运行这个我得到一个NullReferenceException
在CategoryList.ascx
就行了
foreach (WebApp.Data.Category c in Categories) // .CategoriesList.Categories.get returned null
虽然当我尝试在页面 MainMaster.Master
本身上执行相同的 foreach 循环时它工作正常:
<!-- 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 -->
但我不想重复完全相同的代码两次。
有没有正确的方法可以将列表传递给用户控件?
尝试在后面的代码中分配您的类别,为控件提供一个 Id,然后直接引用它:
<custom:CategoryList runat="server" id="categoryList" />
您应该可以在后面的母版页代码中访问它:
categoryList.Categories = Data.Categories.All.ToList();
根据放置此代码的位置,您必须确保事件以正确的顺序触发。
我的网站有帖子类别(例如长篇文章、常见问题解答)。
我试图两次显示指向类别页面的链接列表:在页眉和页脚中。
所以我做了一个 CategoryList : UserControl
和 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; }
}
}
在母版页代码隐藏 MainMaster.Master.cs
我也有一个 List<Category>
是在初始化期间设置的
public List<Category> Categories { get; } = Data.Categories.All.ToList();
现在,在 MainMaster.Master
中,我尝试显示此控件,并使用内联数据绑定表达式将列表传递给它:
<%@ Register TagPrefix="custom" TagName="CategoryList" Src="~/Controls/CategoryList.ascx" %>
<!-- HTML form opening -->
<custom:CategoryList Categories="<%# Categories %>" runat="server" />
<!-- HTML form closing -->
当我运行这个我得到一个NullReferenceException
在CategoryList.ascx
就行了
foreach (WebApp.Data.Category c in Categories) // .CategoriesList.Categories.get returned null
虽然当我尝试在页面 MainMaster.Master
本身上执行相同的 foreach 循环时它工作正常:
<!-- 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 -->
但我不想重复完全相同的代码两次。
有没有正确的方法可以将列表传递给用户控件?
尝试在后面的代码中分配您的类别,为控件提供一个 Id,然后直接引用它:
<custom:CategoryList runat="server" id="categoryList" />
您应该可以在后面的母版页代码中访问它:
categoryList.Categories = Data.Categories.All.ToList();
根据放置此代码的位置,您必须确保事件以正确的顺序触发。