【问题标题】:User Control and constructor用户控件和构造函数
【发布时间】:2014-04-26 20:59:52
【问题描述】:

我在 ascx 页面中构建了一个带有 Web 控件的用户控件。 //ascx文件

 <%@ Control Language="C#" AutoEventWireup="true" ClassName="Product"CodeFile="Product.ascx.cs" Inherits="Usercontrols_Product" %>
<link href="../StyleSheet/StyleSheet.css" rel="stylesheet" type="text/css" />
<div>
<asp:Panel ID="box" CssClass="productBox" runat="server">
 <asp:Image ID="imgProduct"  CssClass="productImage"  runat="server" /><br />
 <asp:Label ID="lblProductName" CssClass="productLbl"  runat="server"></asp:Label><br/>
 <asp:Label ID="lblProductPrice" CssClass="productLbl"  runat="server"></asp:Label>
</asp:Panel>
</div>

在用户控件的 cs 文件中,我创建了一个获取另一个类引用的构造器。 我在contructor中获得的课程我想将数据插入到子控件中。 //ascx.cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Usercontrols_Product : System.Web.UI.UserControl
{
    public EventHandler cmdDetailsClick;
    protected Product thisProduct; 
    public Usercontrols_Product( Product pr)
    {

        thisProduct = pr;
        imgProduct.ImageUrl = thisProduct.ImageUrl;
        lblProductName.Text = thisProduct.CompanyName + "<br/>" +      thisProduct.ProductName + "&nbsp" + thisProduct.Model;
        lblProductPrice.Text = thisProduct.Price.ToString() + "&nbsp" + "israeli shekel";

    }
    public Usercontrols_Product()
    {

    }

    protected void cmdContinue_clicked(object sender, EventArgs e)
    {
        //we send to event product class of sender
        if (cmdDetailsClick != null)
            cmdDetailsClick(thisProduct, EventArgs.Empty);
    }
}

问题在于,现在使用来自 aspx 文件的特殊构造函数 Web 控件不 初始化。我尝试使用 new 关键字在代码中初始化它们,但它们没有来自 ascx 文件的属性。没有特殊的构造函数,它工作正常。但我需要这个特殊的构造函数。我如何使用 ascx 文件中的属性初始化这个 webcontrols

【问题讨论】:

  • 能否给我们看一些代码,以便更容易提供帮助?
  • 请显示更多代码,有点难以理解这种方式出了什么问题

标签: c# asp.net user-controls


【解决方案1】:

UserControl 由 Page 实例化(即用户控件的构造函数不受您的控制) - 您可以定义一个,但将调用默认构造函数。如果你想传递数据,有很多技术可以做到这一点;最简单的方法:

public Product Product {
  set { 
    thisProduct = value;
    imgProduct.ImageUrl = value.ImageUrl;
    lblProductName.Text = value.CompanyName + "<br/>" + 
      value.ProductName + "&nbsp" + value.Model;
    lblProductPrice.Text = value.Price.ToString() + "&nbsp" + "israeli shekel";
  }
}

为了澄清这个过程是如何在后面进行的:

.aspx(或 .ascx)文件正在由 IIS 在运行时编译。 例如,如果您有简单的用户控制:

<%@ Control CodeBehind="FooControl.ascx.cs" Inherits="TestApplication.FooControl" %>
<asp:Literal ID="litBar" runat="server" Text="Whatever" />

IIS 将在您的控制下做出类似的事情(缩短):

namespace ASP {
  public class foocontrol_ascx : global::TestApplication.FooControl {
    private static bool @__initialized;

    public foocontrol_ascx() {
        ((global::WebApplication4.FooControl)(this)).AppRelativeVirtualPath = "~/FooControl.ascx";
        if ((global::ASP.foocontrol_ascx.@__initialized == false)) {
            global::ASP.foocontrol_ascx.@__initialized = true;
        }
    }

    private global::System.Web.UI.WebControls.Literal @__BuildControllitBar() {
        global::System.Web.UI.WebControls.Literal @__ctrl;

        @__ctrl = new global::System.Web.UI.WebControls.Literal();
        this.litBar = @__ctrl;
        @__ctrl.ID = "litBar";
        @__ctrl.Text = "Whatever";
        return @__ctrl;
    }

    private void @__BuildControlTree(foocontrol_ascx @__ctrl) {
        global::System.Web.UI.WebControls.Literal @__ctrl1;
        @__ctrl1 = this.@__BuildControllitBar();
        System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
        @__parser.AddParsedSubObject(@__ctrl1);
    }

    protected override void FrameworkInitialize() {
        base.FrameworkInitialize();
        this.@__BuildControlTree(this);
    }
  }
}

请注意,构建的类继承自您的代码,并且还关注标记(查看它如何创建文字 litBar 并将文本设置为“Whatever”)。此外,此类只有一个构造函数 - 默认构造函数(因此它自然会在代码后面的类中调用默认构造函数)。 IE。 - 您可以为您的控件定义自定义构造函数,但无论如何您都必须提供默认构造函数(以便构建可以使用它)并且构建的类会忽略它(因为 IIS 可能不知道您想要传递给自定义构造函数的参数)。

【讨论】:

  • 首先我想给you.seconed:用户控件是在主机页面中实例化的,所以为什么里面没有web控件
  • @user3576955 - 查看我的更新 - Web 控件在页面内实例化,您只是无法控制它们的构造函数(因为页面/用户控件的实例是由 IIS 创建的,而 IIS 仅调用默认构造函数。它是逻辑框架不知道应该传入什么参数,因此您必须在创建页面/用户控件的实例之后设置上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多