Vb.net 关于回发占位符控件的讨论

Vb.net 关于回发占位符控件的讨论,vb.net,user-controls,ispostback,Vb.net,User Controls,Ispostback,在我的网页中,我正在占位符中加载用户控件。更改ajaxcontroltoolkit评级时,这些用户控件中的每一个都会触发回发。我的问题是如果我使用 If (Not IsPostBack is Nothing) 占位符中的控件在发布时消失 我的页面加载当前看起来像这样 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Session("ProId") =

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

If (Not IsPostBack is Nothing)
占位符中的控件在发布时消失

我的页面加载当前看起来像这样

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检查,控件就会消失,可能是什么问题呢?

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


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

如果要动态添加控件,则每次回发时都必须再次添加控件

尝试使用if(不是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内部调用即可

使现代化 如果希望数据保留在控件中,则必须将数据保存在viewstate中。无论发生什么情况,您都必须再次创建控件,但在将控件发送回用户并从视图状态获取其数据之前。这里用例子来描述它


我放弃了这个问题,因为我决定走另一条路

我尝试将大部分负载放在Page_Init中,但ajax评级控件不断重置。我错过了什么吗。我理解回发问题。您是否将分级控件的CurrentRating属性保存到viewstate,然后在回发时将其设置回发?我使用分级控件的回调结果,该结果设置了值,如Protected Sub Pnting_Changed(ByVal sender作为对象,ByVal e作为AjaxControlToolkit.RatingEventTargets)e.CallbackResult=e.Value OnBubbleCalculate(e)End sub我不认为回调是保存值的方式。在这里可以找到两种解决问题的方法:如果评级控件autopostback设置为false,它就可以工作,但不幸的是,我需要它来保留回发上的值。问题是页面上不会只有一个分级控件,可以有很多分级控件。你也可以用pre-init方法来完成。这是我不希望每次都重新加载控件的事情。我希望他们在回发时留在屏幕上。我不想每次页面往返时都重新加载它们。如果我在pre_init或page_load中使用if(不是IsPostBack)设置它,则所有内容都会被清除,并且它们永远不会被重新加载。我知道您在说什么,您希望控件数据保持原样,您可以通过在viewstate中保存控件状态来实现这一点。我已经给出了上面的示例链接。有太多的数据无法使用视图状态。每个控件都是一个用户控件,可以在其自身内重复多次。要么我真的很笨,要么我不知道,但由于这些控件是动态加载的,我不知道如何存储每个评级控件的数据,尤其是如果有10个或更多评级控件