Проблема области действия ASP.NET C # - PullRequest
1 голос
/ 04 октября 2010

ОК, поэтому я пытаюсь поработать с некоторыми простыми вещами в 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;
        }

    }
}

Теперь я считаю, что проблемазаключается в том, что я не использую получатель и отправитель, но я не уверен на 100%.

Ответы [ 3 ]

3 голосов
/ 04 октября 2010

Я так понимаю, вы переменная height не поддерживается между постбэками?

Это потому, что сеть не имеет состояния. Ваши переменные не поддерживаются между постбэками, пока вы не сохраните значения в Session, ViewState или Hidden Fields. Таким образом, вы можете сделать следующее, чтобы сохранить значение height между PostBacks:

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();
    }
}
1 голос
/ 04 октября 2010

Есть несколько непосредственных проблем с вашим кодом; в методе Page_Load вы создаете новый экземпляр Tree - вам не нужно это делать, поскольку он был автоматически создан IIS при обращении к странице ASP.NET. Используйте ключевое слово this в методе Page_Load, чтобы получить доступ к этому экземпляру.

Кроме того, кажется, ничто не вызывает метод Grow; это намеренно? Разве вы не должны вызывать это из метода btnGrowClicked?

И, наконец, как указывает GenericTypeTea, ваше поле высоты не будет поддерживаться между постбеками. Самый простой способ сделать это с состоянием сеанса, например:

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

private int RestoreHeight()
{
    return (int)this.Session["height"];
}
0 голосов
/ 05 октября 2010

Вы также можете использовать viewstate (если Mono поддерживает его);просто добавьте обновленное значение в viewstate, прежде чем вернуть управление браузеру.Затем прочитайте из viewstate исходное значение, сохраненное в последней обратной передаче, и увеличьте новое значение до него:

public int MyValue {get {return Convert.ToInt32 (viewstate ["myVal"]);} set {viewstate ["myVal"] = значение;}}

Надеюсь, это имеет смысл.

...