我可以通过ASP.Net中页面/控件的前端将类实例传递给自定义用户控件吗?

时间:2012-03-06 22:03:10

标签: c# asp.net user-controls

我有一个自定义用户控件,我通过前端(而不是后面)添加到页面。该客户用户控件具有属于自定义类的属性。我想通过前端用户控件的声明来设置该属性。

这里有一些代码可以帮助您理解我在说什么:

在自定义用户控件.cs:

public BaseTUDSectionControl parentSectionControl
{
   get;
   set;
}

在声明该用户控件的实例时:

<tud:TUDDropDown ID="tddAccountExecutive" runat="server" />

我想将parentSectionControl属性设置在同一行中,如下所示:

<tud:TUDDropDown parentSectionControl=someClassInstance
       ID="tddAccountExecutive" runat="server" />

其中'someClassInstance'是一个确实存在的类实例...是的。我想我会以错误的方式解决这个问题,但我不知道如何做到这一点。出于维护原因,我不想在后端执行此操作,因为我将在整个项目中添加数百个类似的用户控件。

这样的事情是可能的,还是我在吸烟?

2 个答案:

答案 0 :(得分:0)

不,这是不可能的。您只能从标记(您称之为前端)中设置基本类型(int,string,bool)等的属性。如果您有一个要设置为类实例的属性,则必须在代码隐藏(您称之为后端)中完成。

答案 1 :(得分:0)

我不确定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很重要。所以你仍需要代码隐藏中的一行,但你仍然可以获得在代码前设置属性的可读性好处。