我有一个自定义用户控件,我通过前端(而不是后面)添加到页面。该客户用户控件具有属于自定义类的属性。我想通过前端的用户控件声明来设置该属性。
这里有一些代码可以帮助您理解我在说什么:
在自定义用户控件.cs中:
public BaseTUDSectionControl parentSectionControl
{
get;
set;
}
并在声明该用户控件的实例时:
<tud:TUDDropDown ID="tddAccountExecutive" runat="server" />
我想在同一行中设置parentSectionControl属性,如下所示:
<tud:TUDDropDown parentSectionControl=someClassInstance
ID="tddAccountExecutive" runat="server" />
其中'someClassInstance'是一个确实存在的类实例...是的。我想我会以错误的方式解决这个问题,但我不知道如何做到这一点。出于维护原因,我不想在后端执行此操作,因为我将在整个项目中添加数百个类似的用户控件。
这样的事情是可能的,还是我在吸烟?
不,这是不可能的。您只能从标记(您称之为前端)设置基本类型(int,string,bool)等的属性。如果您有一个要设置为类实例的属性,则必须在代码隐藏(您称之为后端)中完成。
我不确定Microsoft何时/何时将此功能添加到ASP.NET中,但实际上可以在代码前端设置非基本类型属性:
TestPage.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestPage.aspx.cs" Inherits="TestPage" %>
<%@ Register Src="~/Control.ascx" TagPrefix="custom" TagName="Control" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Test Page</title></head>
<body>
<custom:Control ID="TestControl" Items='<%# Items %>' runat="server" />
</body>
</html>
TestPage.aspx.cs:
using System;
using System.Collections.Generic;
using System.Web.UI;
public partial class TestPage : Page
{
protected void Page_Load(object sender, EventArgs e)
{
TestControl.DataBind();
}
protected List<string> Items = new List<string>() { "Hello", "world!", };
}
Control.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Control.ascx.cs" Inherits="Control" %>
<asp:Repeater ID="Repeater" ItemType="System.string" runat="server">
<ItemTemplate>
<p><%# Item %></p>
</ItemTemplate>
</asp:Repeater>
Control.ascx.cs:
using System;
using System.Collections.Generic;
using System.Web.UI;
public partial class Control : UserControl
{
public List<string> Items { get; set; }
protected override void OnPreRender(EventArgs e)
{
Repeater.DataSource = Items;
Repeater.DataBind();
}
}
注意:这对bind the control from the page which sets the property很重要。因此,您仍然需要代码隐藏中的一行,但您仍然可以获得在代码前设置属性的可读性优势。