繁体   English   中英

ASP.NET C#范围问题

[英]ASP.NET C# scope issue

好吧,所以我想在ASP.NET和C#中使用一些简单的东西来获得超级超级基础知识,我很难找到如何让这个范围问题起作用。 至少,我认为这是一个范围问题! :)

所以,这是我的Default.aspx演示文稿标记:

<%@ Page Language="C#" Inherits="project1.Tree" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <title>project1_test</title>
</head>
<body>
    <form runat="server">
        <p><asp:label runat="server" id="lblOutput" /></p>
        <asp:TextBox ID="txtGrowBy" runat="server" />
        <asp:Button id="btnGrow" runat="server" Text="Grow!!!" />
    </form>
</body>
</html>

这是我的CodeBehind文件:

using System;
using System.Web;
using System.Web.UI;

namespace project1
{
    public partial class Tree : System.Web.UI.Page
    {

        public int height = 0;

        public void Grow(int heightToGrow) {
            height += heightToGrow;
        }

        protected void Page_Load(Object Source, EventArgs E)    
        {    
            Tree tree1 = new Tree();

            string msg = "Let's plant a tree!<br/>";        

            msg += "I've created a tree with a height of " +    
            tree1.height + " metres.<br/>";    

            lblOutput.Text = msg;
        }

        public virtual void btnGrowClicked (object sender, EventArgs args)
        {
            txtGrowBy.Text = tree1.heightToGrow;
        }

    }
}

现在,我认为问题在于我没有使用吸气剂和发送者,但我不是百分百肯定。

我认为你在回发之间没有保持可变的height

这是因为网络是无国籍的。 除非您将值存储在Session,ViewState或Hidden Fields中,否则不会在回发之间维护变量。 因此,您可以执行以下操作来维护PostBack之间的height值:

ASPX:

<form runat="server">
    <asp:HiddenField id="hd_Height" runat="server" />
</form>

代码背后:

public int Height
{
    get
    {
       return int.Parse(hd_Height.Value).ToString();
    }
    set
    {
        hd_Height.Value = value.ToString();
    }
}

你的代码有几个直接的问题; 在Page_Load方法中,您正在创建一个新的Tree实例 - 您不必这样做,因为在访问ASP.NET页面时,IIS会自动创建一个实例。 在Page_Load方法中使用this关键字可以访问该实例。

此外,似乎没有任何东西可以称为Grow方法; 这是故意的吗? 你不应该在btnGrowClicked方法中调用它吗?

最后,当GenericTypeTea指出时,你的高度字段将不会在回发之间保持。 最简单的方法是使用会话状态,例如:

private void PersistHeight(int height)
{
    this.Session["height"] = height;
}

private int RestoreHeight()
{
    return (int)this.Session["height"];
}

您也可以使用viewstate(如果Mono支持它); 在将控制权交还给浏览器之前,只需将更新后的值添加到viewstate即可。 然后从viewstate中读取最后一个回发中保存的原始值并将新值递增到它:

public int MyValue {get {return Convert.ToInt32(viewstate [“myVal”]);} set {viewstate [“myVal”] = value;}}

我希望这是有道理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM