簡體   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