【问题标题】:Page_Load not firing in UserControlPage_Load 未在 UserControl 中触发
【发布时间】:2013-03-28 23:53:22
【问题描述】:

我在类库中的 c# 中创建了一个类,并且我已将此控件添加到 default.aspx,但我的代码不会触发 page_load 事件。代码如下:

我做错了什么?

页面加载但未在页面上显示标签。我已将控件正确添加到页面,没有任何错误。我已经在其中添加了注册标签。

html标签:<RandoIntegerControls:RandomIntegerControl ID="RandomIntegerControl1" runat="server"></RandoIntegerControls:RandomIntegerControl>

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

namespace CSIMedia.WebControls
{

  public class RandomIntegerControl : PlaceHolder
  {

    private Label _Label;


    public RandomIntegerControl()
    {

    }

    private void Page_Load(Object sender, EventArgs e)
    {

        this._Label = new Label();
        this.Controls.Add(this._Label);
        this._Label.Text = "Enter random values:";

    }

  }
}

Default.aspx 页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register TagPrefix="RandoIntegerControls" Assembly="CSIMedia.WebControls" Namespace="CSIMedia.WebControls"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <RandoIntegerControls:RandomIntegerControl ID="RandomIntegerControl1" runat="server"></RandoIntegerControls:RandomIntegerControl>
    </div>
    </form>
</body>
</html>

【问题讨论】:

  • 您是否将自定义控件的 .ascx 文件包含在使用它的 aspx 文件中?
  • 不,我删除了它。我没有创建任何 ascx 文件。我已将此类创建为 class.cs 文件,并将此控件类添加到页面中。但我已经添加了 default.aspx 页面,但我仍然没有运气。
  • 你能显示你在页面中添加控件的代码吗?
  • 我复制并粘贴了代码,但它不允许我添加 html,或者我可以这样做,只是添加了一些我不知道为什么的 html?
  • 尝试使用代码示例图标 { } 添加代码。

标签: c# asp.net c#-3.0


【解决方案1】:

试试这个:

public RandomIntegerControl()
{
    this.Load += Page_Load;
}

在页面(和用户控件)中,Page_Load 方法通常会自动附加,这要归功于此属性:

&lt;%@ Page ... AutoEventWireup="true" ... %&gt;

如果你没有 aspx/ascx 文件,它不会自动发生,但你仍然可以用上面的代码手动连接它。

【讨论】:

  • 当我将此代码转换为 vb.net 时,一切正常。我是 VB.Net 开发人员,但在我申请的角色中被要求使用 c# 进行测试项目,有什么最好的方法可以快速完成测试,以便我可以快速完成测试?
  • 抱歉,我不确定我是否理解这个问题。我写的代码是C#,请问你要VB版吗?
【解决方案2】:

您从 PlaceHolder 继承,这是一个 Web 控件,不会处理 Page_Load 事件。只有用户控件 (.ascx) 才能隐式处理该事件。

从您发布的代码的外观来看,使用 UserControl 可能会更好,或者如果您需要在多个项目中重复使用它,请从头开始创建一个 Web 控件。

【讨论】:

  • @clint 不是我所做的,从头开始创建了一个 web 控件吗?你的意思是我需要从 web 控件继承 page_load 才能触发?
  • 不,要从头开始创建 Web 控件,您需要从 Web 控件本身继承并覆盖相关方法来创建控件。从 PlaceHolder 继承意味着功能已经发生。
  • 你被要求做什么?
  • @Clint 只是为了创建一个允许用户输入随机数并以 asc 或 desc 顺序显示它们的应用程序,他们提供了 css 和 html,我只需要让功能正常工作。跨度>
  • @Clint 谢谢,谢谢大家。我现在正在使用这些方法及其工作正常,基本上我使用“受保护的覆盖无效 OnInit(EventArgs e)”来触发事件。这可以@Clint吗?
【解决方案3】:

事实证明,您可以在 aspx 标记文件中覆盖 Page_Load。该文件继承自基本文件。

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

覆盖示例:

<script language="C#" runat="server">
    public void Page_Load(object sender, EventArgs e)
    {
        ...
    }
</script>

此函数会覆盖代码隐藏版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多