自定义控件的问题

zafu_acm 2014-11-01 10:47:27
在做一个项目的时候 定义了一个UserParctice.ascx自定义控件 如下
<%@ Control Language="C#" AutoEventWireup="true" Inherits="UserPratice" Codebehind="UserPratice.ascx.cs" %>


<table width="820px" align="left"
cellpadding="0" cellspacing="0"><tr><td align="center">
<asp:Label ID="lbTitle" runat="server"></asp:Label>
<asp:Label ID="lbPracticeId" runat="server" Visible="False"></asp:Label>
</td></tr>
<tr><td>
<asp:Panel ID="PlaceHolder1" Width="820px" runat="server"></asp:Panel>
</td></tr>
<tr><td><asp:GridView ID="GV_Grade" runat="server" CellPadding="4"
ForeColor="#333333" GridLines="None" Width="100%"
EmptyDataText="抱歉,暂无数据。">
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#EFF3FB" HorizontalAlign="Center" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<EditRowStyle BackColor="#2461BF" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
</td></tr>
</table>


然后在其后台类中有一个PracticePaperId成员 在其中的CreatePractice里对其赋值供其他成员函数使用
public partial class UserPratice : System.Web.UI.UserControl
{

CPracticePater paper = new CPracticePater();
string practiceid = "";
string practicePaperId = "";

protected void Page_Init(object sender, EventArgs e)
{
…………………………………………

}
public void CreatePractice( …………)
{
this.practicePaperId = ………………;
}
}


问题来了 我在调试的过程中 我每点击跳转一次页面 string practicePaperId = ""; 这条语句就被执行一次 甚至在首页里并没有这个空件 也会执行这条语句 是控件多次被实例化了吗 在线求解答
...全文
275 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zafu_acm 2014-11-02
  • 打赏
  • 举报
回复
引用 15 楼 sp1234 的回复:
轻量级的ajax,是“单页面”的客户端javascript真的去局部改变DOM对象内容,从而局部刷新的。 而asp.net ajax是2003研发2005年发布的东西,那个时代的产物,它实际上回发到服务器端重建整个页面,只不过是“伪局部刷新”客户端页面,在服务器端没有半点“局部刷新”的功能的。
可以再回答一下吗 那么是否有必要放弃或少用asp.net ajax,改为用Javascript实现? 感觉asp.net自带的控件用起来不舒服 像您说的 如果要想了解这些控件的机制 应该通过什么或者说在哪里了解呢 相关书籍好像也没并没有提及
daidaide0003 2014-11-02
  • 打赏
  • 举报
回复
那么是否有必要放弃或少用asp.net ajax,改为用Javascript实现? 感觉asp.net自带的控件用起来不舒服 像您说的 如果要想了解这些控件的机制 应该通过什么或者说在哪里了解呢 相关书籍好像也没并没有提及
  • 打赏
  • 举报
回复
你在这条语句调试中断时,可以查看“调用堆栈”,可以看所有的调用入口、以及入口代码的环境变量值。你不贴出来,谁也不知道程序怎么调用它。 另外你在问题中也没有说明“何处调用 CreatePractice 这个方法”。这在vs开发工具上需要使用“查找所有引用”来找到,而且要先贴出来,否则谁也不知道你何时调用它。 设置 if(!ispostback) 没有意义。因为这个地方根本取不到“postback”状态,这个 if 判断永远都是 true。而且就算取到 postback状态,也是瞎拼凑的、不符合业务逻辑的。
zafu_acm 2014-11-01
  • 打赏
  • 举报
回复
引用 15 楼 sp1234 的回复:
轻量级的ajax,是“单页面”的客户端javascript真的去局部改变DOM对象内容,从而局部刷新的。 而asp.net ajax是2003研发2005年发布的东西,那个时代的产物,它实际上回发到服务器端重建整个页面,只不过是“伪局部刷新”客户端页面,在服务器端没有半点“局部刷新”的功能的。
那么是否有必要放弃或少用asp.net ajax,改为用Javascript实现? 感觉asp.net自带的控件用起来不舒服 像您说的 如果要想了解这些控件的机制 应该通过什么或者说在哪里了解呢 相关书籍好像也没并没有提及
zafu_acm 2014-11-01
  • 打赏
  • 举报
回复
现在我把practicePaperId设成static是可以解决问题 但是我不知道为什么这个控件会被多次实例化?或者说是为什么 string practicePaperId = "";会被多次执行?
zafu_acm 2014-11-01
  • 打赏
  • 举报
回复
引用 2 楼 zhanxueguang 的回复:

public partial class UserPratice : System.Web.UI.UserControl
{
 
    CPracticePater paper = new CPracticePater();                    
   
    string practiceid= "";
 
    protected void Page_Init(object sender, EventArgs e)
    {
       …………………………………………
               if(!ispostback)
                     string practicePaperId   = "";    
    }
    public void CreatePractice( …………)
   {
        this.practicePaperId = ………………;
   }
}
但是这个practicePaperId我在该类的其他成员函数也是要用到的呀
Rajesh_James 2014-11-01
  • 打赏
  • 举报
回复

public partial class UserPratice : System.Web.UI.UserControl
{
 
    CPracticePater paper = new CPracticePater();                    
   
    string practiceid= "";
 
    protected void Page_Init(object sender, EventArgs e)
    {
       …………………………………………
               if(!ispostback)
                     string practicePaperId   = "";    
    }
    public void CreatePractice( …………)
   {
        this.practicePaperId = ………………;
   }
}
zafu_acm 2014-11-01
  • 打赏
  • 举报
回复
<body>

    <form id="form1" runat="server">
        <table width="800" height="25" border="0" align="center" cellpadding="0" cellspacing="0">
            <tr>
                <td>您的位置:<a href="CourseStudyRight.aspx">首页</a>>><a href="SPracticeList.aspx">在线练习</a>>>完成练习</td>
                <td align="center">

                    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
                    
                     <asp:UpdatePanel ID="UpdatePanel1" runat="server">

                        <ContentTemplate>
                 
                            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                            <asp:Timer ID="Timer1" runat="server" OnTick="Timer1_Tick" Interval="1000"></asp:Timer>
                         </ContentTemplate>
                    </asp:UpdatePanel>
                  
                </td>
            </tr>
        </table>
        <table width="800" align="center">
            <tr>
                <td>
                    <asp:Panel ID="Panel2" runat="server">
                        <uc1:UserPratice ID="UserPratice1" runat="server" />
                    </asp:Panel>
                </td>
            </tr>
            <tr>
                <td align="center">
                    <asp:Button ID="btnTiJiaoAll"
                        OnClientClick="return Checksubmit();" runat="server" Text="全部提交"
                        OnClick="btnTiJiaoAll_Click" CssClass="inputbuton" />
                </td>
            </tr>
        </table>

    </form>
</body>
只在这一处地方 用到了这个控件
  • 打赏
  • 举报
回复
轻量级的ajax,是“单页面”的客户端javascript真的去局部改变DOM对象内容,从而局部刷新的。 而asp.net ajax是2003研发2005年发布的东西,那个时代的产物,它实际上回发到服务器端重建整个页面,只不过是“伪局部刷新”客户端页面,在服务器端没有半点“局部刷新”的功能的。
  • 打赏
  • 举报
回复
引用 12 楼 u010724594 的回复:
单步执行几次后 跳转到了这个aspx页面里 我发现了问题 这个aspx里有个timer1控件用来显示时分秒考试倒计时 当interval间隔为1秒的时候 timer1_tick和string practicePaperId = "";这个初始化是同步进行的 为了证明这一点 我把interval设为10秒 发现确实如此 是UserParctice.ascx随着timer控件一起刷新了吗 但是为什么呢 我并没有把UserPartice放到UpdatePanel里面去呀
嗯,我在csdn上没有太多耐心看大段的程序,要么是根据你的流程设计描述,要么就只能根据快速地(可能就是几秒钟的)阅读你的代码大概看一下。 根据我的理解,你是不太理解 UpdataPanel 机制问题。实际上asp.net ajax根本不是真正轻量级的 ajax,因此它提交数据时仍然是在服务器端重建了整个aspx(这也就包括了内部包含的ascx)。真因为这样,asp.net ajax才可能真正正确处理所有的控件的状态数据,并且触发所有事件(包括不在UpdataPanel里边的控件的事件)。虽然你以为仅仅“局部刷新”了,其实asp.net是整个重建整个aspx控件的。 基于这个原理,重新设计你的程序逻辑流程,避免数据处理错误。
zafu_acm 2014-11-01
  • 打赏
  • 举报
回复
上面Label1是用来显示倒计时文本的 Timer1是定时器 UserPratice1是自定义控件
zafu_acm 2014-11-01
  • 打赏
  • 举报
回复
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="StudentPractice.aspx.cs" Inherits="Webs.StudentPractice" %>

<%@ Register Src="App_Controls/UserPratice.ascx" TagName="UserPratice" TagPrefix="uc1" %>
<!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>
    <link href="../css/css.css" rel="stylesheet" type="text/css" />
    <script type="text/JavaScript" src="../JS/frame.js"></script>
</head>
<body>

    <form id="form1" runat="server">
        <table width="800" height="25" border="0" align="center" cellpadding="0" cellspacing="0">
            <tr>
                <td>您的位置:<a href="CourseStudyRight.aspx">首页</a>>><a href="SPracticeList.aspx">在线练习</a>>>完成练习</td>
                <td align="center">

                    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
                    
                     <asp:UpdatePanel ID="UpdatePanel1" runat="server">

                        <ContentTemplate>
                 
                            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                            <asp:Timer ID="Timer1" runat="server" OnTick="Timer1_Tick" Interval="10000"></asp:Timer>
                         </ContentTemplate>
                    </asp:UpdatePanel>
                  
                </td>
            </tr>
        </table>
        <table width="800" align="center">
            <tr>
                <td>
                    <asp:Panel ID="Panel2" runat="server">
                        <uc1:UserPratice ID="UserPratice1" runat="server" />
                    </asp:Panel>
                </td>
            </tr>
            <tr>
                <td align="center">
                    <asp:Button ID="btnTiJiaoAll"
                        OnClientClick="return Checksubmit();" runat="server" Text="全部提交"
                        OnClick="btnTiJiaoAll_Click" CssClass="inputbuton" />
                </td>
            </tr>
        </table>

    </form>
</body>
</html>
单步执行几次后 跳转到了这个aspx页面里 我发现了问题 这个aspx里有个timer1控件用来显示时分秒考试倒计时 当interval间隔为1秒的时候 timer1_tick和string practicePaperId = "";这个初始化是同步进行的 为了证明这一点 我把interval设为10秒 发现确实如此 是UserParctice.ascx随着timer控件一起刷新了吗 但是为什么呢 我并没有把UserPartice放到UpdatePanel里面去呀
  • 打赏
  • 举报
回复
单步执行2、3行,就会回到宿主的aspx里边去执行,你就知道是哪个页面在调用它了。
zafu_acm 2014-11-01
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
[quote=引用 7 楼 u010724594 的回复:]
调用堆栈看不来 是这样吗


从你贴的图,看不出你调试时中断在哪一行?!

如果中断在你在问题中说的那一行赋值语句,那么堆栈顶层应该看到的是

xxxxxxxx.dll!UserParctice.CreatePractice() 行 25

这样的CreatePractice方法,而不是对象初始化方法。
[/quote]



调用堆栈中还是显示这条 可以看出什么吗
  • 打赏
  • 举报
回复
恩,我又看了一下你的代码,你要跟踪的确实是对象初始化方法。 那么你可以在这个中断时,“单步”继续调试两三行,自然就能看到所属的页面了。
  • 打赏
  • 举报
回复
引用 7 楼 u010724594 的回复:
调用堆栈看不来 是这样吗
从你贴的图,看不出你调试时中断在哪一行?! 如果中断在你在问题中说的那一行赋值语句,那么堆栈顶层应该看到的是 xxxxxxxx.dll!UserParctice.CreatePractice() 行 25 这样的CreatePractice方法,而不是对象初始化方法。
zafu_acm 2014-11-01
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
你在这条语句调试中断时,可以查看“调用堆栈”,可以看所有的调用入口、以及入口代码的环境变量值。你不贴出来,谁也不知道程序怎么调用它。

另外你在问题中也没有说明“何处调用 CreatePractice 这个方法”。这在vs开发工具上需要使用“查找所有引用”来找到,而且要先贴出来,否则谁也不知道你何时调用它。

设置 if(!ispostback) 没有意义。因为这个地方根本取不到“postback”状态,这个 if 判断永远都是 true。而且就算取到 postback状态,也是瞎拼凑的、不符合业务逻辑的。


调用堆栈看不来 是这样吗
zafu_acm 2014-11-01
  • 打赏
  • 举报
回复
public partial class UserPratice : System.Web.UI.UserControl
{
 
    CPracticePater paper = new CPracticePater();
    string practiceid = "";
    string practicePaperId = "";
 
    protected void Page_Load(object sender, EventArgs e)
    {
       if (!IsPostBack)
        {
            tystk.Models.CUser cUser = (tystk.Models.CUser)Session["LoginUsr"];
            if (cUser != null)
            {
                if (Request.Params["practiceId"] == null)
                {
                    Response.Write("<script>alert('抱歉,读取试卷出错!');location.reload('SPracticeList.aspx');</script>");
                    return;
                }
                this.practiceid = Request.Params["practiceId"].ToString();
                this.CreatePractice(cUser);     //调用CreatPractice
            }
            else
            {
                ErrorLog("登陆超时!");
                Response.Redirect("../LetMeIn.aspx");
            }
        }
 
    }
    public void CreatePractice( )
   {
        this.practicePaperId = ………………;
   }
    
   public void CheckPratice( )
   {
        ............  = this.practicePaperId;
    }
}
这是详细 而且我现在发现 string practicePaperId = ""; 是一直不断地在初始化 当我进入首页 首页总不包含这个控件 我也没有进行任何操作 但是这条语句不停地在执行 设为断点以后 按一下F5马上就跳回到这条语句

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧