【问题标题】:On Postback placeholder controls disappearing在回发占位符控件消失
【发布时间】:2011-11-19 23:13:45
【问题描述】:

在我的网页中,我在占位符中加载用户控件。当 ajaxcontroltoolkit 评级发生更改时,每个用户控件都会触发回发。我遇到的问题是,如果我使用

If (Not IsPostBack is Nothing)

占位符内的控件在帖子中消失。

我的 Page_Load 目前看起来像这样

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Session("ProId") = Nothing
    Session("FolId") = Nothing
    Dim ProId As Integer
    If (Not Request.QueryString("ProjectID") Is Nothing) Then
        ProId = Convert.ToInt32(Request.QueryString("ProjectID").ToString())
        Session("ProId") = Request.QueryString("ProjectID").ToString()
    End If
    Dim FolId As Integer
    If (Not Request.QueryString("FolderID") Is Nothing) Then
        FolId = Convert.ToInt32(Request.QueryString("FolderID").ToString())
        Session("FolId") = Request.QueryString("FolderID").ToString()
    End If
    objUser = New BSSiteUser(CInt(Page.User.SiteUser.intID))
    objProject = New BSProject(ProId)
    objFolder = New BSFolder(objUser.SiteUserID, FolId)
    objOrganization = New BSOrganization(objProject.intOrganizationID, objUser.SiteUserID)
    Me.Load_SubcontractorList()
    Me.Load_EvaluationList(1)
    Me.Load_EvaluationList(2)
    Me.lblorganization.Text = objOrganization.CompanyName
    Me.lblprojectname.Text = objProject.strProjectName
    Me.lblprojectnumber.Text = objProject.strProjectNumber
    Me.lbldatecreated.Text = Date.Now.Date.ToString()
End Sub

Load_EvaluationList 是加载用户控件的内容,如果我在这两个周围放置 IsPostBack 检查,控件就会消失,可能是什么问题

【问题讨论】:

    标签: vb.net user-controls ispostback


    【解决方案1】:

    当您使用全新的页面实例时,动态添加的控件会在回发时消失。为了让您保留它们,您将不得不为发生的任何回发重新创建它们。

    还需要注意的是,如果您希望保留 ViewState,则应在 Page Init 而不是 Page Load 上创建用户控件,因为在 Load 事件之前将 ViewState 数据加载回控件。

    【讨论】:

    • 我尝试将大部分负载放到 Page_Init 中,但 ajax 分级控制不断被重置。我是不是错过了什么。我了解回发问题
    • 您是否将评级控件的 CurrentRating 属性保存到视图状态,然后在回发时将其设置回?
    • 我正在使用评级控件的 CallbackResult 设置值,例如 Protected Sub pntrating_Changed(ByVal sender As Object, ByVal e As AjaxControlToolkit.RatingEventArgs) e.CallbackResult = e.Value OnBubbleCalculate(e) End子
    • 我不认为回调是你要保存价值的方式。在这里寻找解决您问题的两种方法:lancezhang.wordpress.com/2008/11/10/create-rating-dynamically
    • 如果评级控制自动回发设置为 false,它可以工作,但不幸的是,我需要它来保留回发的值。问题是页面上不会只有一个评级控件,可以有许多评级控件
    【解决方案2】:

    如果您是动态添加控件,那么在每次回发时您都必须再次添加控件。

    尝试使用 if(Not IsPostBack) 或 (IsPostBack) 而不是将其与 Nothing 进行比较。

    这里我只是在回发时动态添加一个文本框,它将保留在每个回发中。

         Partial Class _Default
            Inherits System.Web.UI.Page
    
          Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If (IsPostBack) Then
            Dim t As TextBox = New TextBox()
            form1.Controls.Add(t)
    
        End If
    
    End Sub
    

    结束类

    您可以将尝试动态添加的控件放入一个函数/方法/子例程中,然后在 Load 内部调用。

    更新

    如果您希望数据保留在控件中,则必须将数据保存在视图状态中。无论如何,您都必须再次创建控件,但在将控件发送回用户之前,从视图状态中获取他们的数据。这里用例子来说明。

    http://forums.asp.net/t/1186195.aspx/1

    【讨论】:

    • 也可以在pre init方法中进行。
    • 这就是我不希望控件每次都重新加载的原因。我希望他们在回发时留在屏幕上。我不想每次页面往返时都重新加载它们。如果我用 if (Not IsPostBack) 在 pre_init 或 page_load 中设置它,一切都会被清除并且它们永远不会重新加载
    • 我知道你在说你想要控件数据原样,你可以通过将控件状态保存在视图状态中来实现。我已经给出了上面的示例链接。
    • 数据太多,无法使用视图状态。每个控件都是一个用户控件,可以在其内部重复多次。
    • 要么我真的很愚蠢,要么我不知道,但由于这些控件是动态加载的,我不知道如何存储每个评级控件的数据,尤其是如果有 10 个或更多
    【解决方案3】:

    我决定放弃这个问题,因为决定走不同的路线

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 2023-03-10
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多