2016-06-21 34 views
0
  • 控制(例如标签)在页面加载时更改值。
  • 在页面加载之前,标签值为“x”
  • 继续加载页面自然x在此处丢失,那么什么是简单的方法来存储来自前一页 加载的值?
+0

状态管理 - https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx – riteshmeher

+0

静态变量通常是最简单的方法。然后检查变量是否与测试方式保持一致。 – Adam

+4

@Adam一个网页中的静态变量_shared页面的所有视图__ – stuartd

回答

-1

我不知道如果这是你的意思是,没有任何代码示例,但是我从记忆知道,在ASP.NET可以访问以前的页面属性,像这样:

Page lastPage = currentPage.PreviousPage 

它返回整个页面对象。假设你的标签定义,像这样:

<asp:label id="myLabel" runat="server" /> 

然后你就可以与访问text属性:

Label myLabel = lastPage.FindControl("myLabel") as Label; 
lastPageVal = myLabel.Text 

所以确保lastPageVal是一个静态变量,那么它也将持续整个页面。

0

这听起来像你想要的是以前的页面状态的历史,或者至少只有一个以前的值。我可以建议一种方法来做到这一点,但有一个警告:不要过度使用它。您可以在ViewState之间的帖子之间保留数据,但该数据会写入页面本身。这样,当用户发布表单时,他们也会将该数据发回。 (更多结尾。)

下面是一个简单的例子。首先,定义一些类,它包含所有的附加状态要存储:

[Serializable] 
public class PageState 
{ 
    public string MyLabelPreviousText {get;set;} 
} 

然后在后面的代码:

public partial class MainPage : System.Web.UI.Page 
{ 
    private PageState _pageState; 

    protected void Page_Load(object source, EventArgs e) 
    { 
     _pageState = ViewState["pageState"] as PageState ?? new PageState(); 
     _pageState.MyLabelPreviousText = MyLabel.Text; 
    } 

    protected void Page_PreRender(object sender, EventArgs e) 
    { 
     ViewState["pageState"] = _pageState; 
    } 

当加载页面,你检查,看看是否你已经将你的班级(在这种情况下称为PageState)保存到ViewState。如果你还没有,你创建一个新的。

PreRender事件中,更新完页面后,您将使用标签文本更新该类,然后再次将整个事件保存到ViewState。这种方式下次页面加载时,你可以再次检索它。

我不确定您希望在哪一点保存标签的以前的文字。在本例中,它将在Load事件期间保存文本。这样,如果从那时起文本在任何时候都发生了变化,那么您保存的值就是标签的原始文本。具体细节可能会因您尝试执行的操作而有所不同,但此模式可让您保存这类自定义数据,而无需使用Session并在内存中堆叠如此的数据。

我提到过没有过度使用它。如果您保存一些标签,控件和其他数据,ViewState可能不会太大。无论如何,ASP.NET已经将每个服务器控件的状态都放在那里。但如果你真的疯了,那么ViewState可能会变得很大。所有这些数据都被写入页面,并且每次回发都将其全部发送回服务器。

这可能不是一个大问题,但要注意它。使用Chrome开发工具,Fiddler,甚至只是检查页面源代码,以查看数据是否变得太大以至于可能会影响性能。

对于任何人谁不熟悉,ViewState看起来像这样在HTML源代码:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
    value="/wEPDwULLTEyMzgxNzgyNDIPZBYCZg9kFgICAQ9kFggCAQ9kFgJmD2QWAgIBD2QWAmYPZBYMA 
... etc. 

正如你可以看到,它实际上是一个隐藏的表单输入。 ASP.NET将页面控件的所有细节都放在表单中,这样当您发布表单时,它可以将所有这些细节放在一起,并确保页面在回发后看起来相同。这就是为什么当我们第一次检查if(!IsPostBack())时,我们设置了很多控件。如果它是回发,那么我们不需要重新填充下拉菜单等。他们从那个ViewState数据恢复。

该方法在功能上与添加一个额外的隐藏输入相同,如一条评论中所建议的。不同之处在于您使用的是现有的隐藏输入(视图状态),并且如果您需要保存多个值,那么您只需使其成为类的属性,而不是添加越来越多的隐藏输入。

+0

Scott ,谢谢你的详细回复。但我有一些疑虑。在我的情况下,我想存储这些值以供将来使用,它是由Page_Init调用的由另一个方法调用的Button_Click方法。因此,在所有处理完成后,我在Button_Click方法的末尾添加Page_Load的代码。我想在同一个方法的开头检索前一个值。所以我应该在Button_Click的开始处移动ViewState [“pageState”] = _pageState;'在哪里读取我需要的信息?我应该不能从_pageState读取? –

+0

另外为什么要使用_pageState呢?我不能单独使用ViewState,并且在用我的下一个值覆盖之前从ViewState中读取数据? –