ASP.NET/C# CONTROL-从上一页加载中存储值


  • 控制(例如标签)在页面加载时会更改值。
  • 页面加载之前,标签值为" x"
  • 继续加载页面自然X在这一点上丢失了,因此,什么是存储上一页的值的简单方法加载?

这听起来像是您想要的是页面以前状态的历史,或者至少是一个先前的值。我可以提出一种方法来做到这一点,但是请注意:不要过度使用它。您可以在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 Dev工具,提琴手,甚至只是检查您的页面源以查看该数据是否变得如此之大以至于可能会影响性能。

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

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

您可以看到,它实际上是隐藏的表单输入。ASP.NET将页面控件的所有详细信息放在表单中,以便在您发布表单时,它可以将所有这些内容拼凑在一起,并确保页面后的页面看起来相同。这就是为什么我们第一次检查if(!IsPostBack())时设置大量控件时的原因。如果是寄回,那么我们就不需要填充下拉菜,等等。它们从该ViewState数据恢复。

这种方法在功能上与添加一个评论中建议的其他隐藏输入相同。不同之处在于,您使用的是现有的隐藏输入(ViewState),如果您需要保存多个值,则只是使它们成为类的属性,而不是添加越来越多的隐藏输入。

我不确定这是您没有任何代码示例的意思

Page lastPage = currentPage.PreviousPage

返回整个页面对象。假设您的标签被定义为:

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

然后,您可以使用以下方式访问文本属性。

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

因此,请确保LastPageVal是一个静态变量,然后它也将持续到整个页面。

最新更新