代码之家  ›  专栏  ›  技术社区  ›  Skillzore

c#如何正确利用Page_init、ViewState和Page_Load?

  •  2
  • Skillzore  · 技术社区  · 7 年前

    this answer ,但觉得它有点过于泛化。关于如何应对这些事件,我还没有找到一个像样、具体的例子。

    foreach (Service service in Services)
    {
        // service div
        HtmlGenericControl serviceDiv = new HtmlGenericControl("div");
        serviceDiv.ID = service.ID;
        serviceDiv.Style.Add(HtmlTextWriterStyle.TextAlign, "center");
        outerDiv.Controls.Add(serviceDiv); //outerDiv exists in the aspx page
    
        // service updatepanel
        UpdatePanel uPanel = new UpdatePanel()
        {
            ID = service.ID + "_uPanel",
            UpdateMode = UpdatePanelUpdateMode.Conditional
        };
        serviceDiv.Controls.Add(uPanel);
    
        // status span
        HtmlGenericControl statusSpan = new HtmlGenericControl("span");
        statusSpan.ID = service.ID + "_statusSpan";
        statusSpan.InnerHtml = service.Status;
        uPanel.ContentTemplateContainer.Controls.Add(statusSpan);
    
        // show specific content
        if (service.Status.Equals(ServiceControllerStatus.Running.ToString()))
        {
            // status color
            statusSpan.Attributes.Add("class", "status-run");
    
            // stop button
            HtmlButton stopButton = new HtmlButton();
            stopButton.ID = service.ID + "_btnStop";
            stopButton.InnerHtml = "<i class=\"fa fa-stop btn-red\"/></i>";
            stopButton.Attributes.Add("type", "button");
            stopButton.Attributes.Add("runat", "server");
            stopButton.Attributes.Add("class", "btn btn-link btn-xs");
            stopButton.Attributes.Add("title", "Stop");
            stopButton.ServerClick += new EventHandler(BtnStop_Click);
            ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(stopButton);
            uPanel.ContentTemplateContainer.Controls.Add(stopButton);
    
            // restart button
            HtmlButton restartButton = new HtmlButton();
            restartButton.ID = service.ID + "_btnRestart";
            restartButton.InnerHtml = "<i class=\"fa fa-refresh btn-blue\"/></i>";
            restartButton.Attributes.Add("type", "button");
            restartButton.Attributes.Add("runat", "server");
            restartButton.Attributes.Add("class", "btn btn-link btn-xs");
            restartButton.Attributes.Add("title", "Restart");
            restartButton.ServerClick += new EventHandler(BtnRestart_Click);
            ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(restartButton);
            uPanel.ContentTemplateContainer.Controls.Add(restartButton);
        }
        else
        {
            // status color
            statusSpan.Attributes.Add("class", "status-stop");
    
            // start button
            HtmlButton startButton = new HtmlButton();
            startButton.ID = service.ID + "_btnStart";
            startButton.InnerHtml = "<i class=\"fa fa-play btn-green\"/></i>";
            startButton.Attributes.Add("type", "button");
            startButton.Attributes.Add("runat", "server");
            startButton.Attributes.Add("class", "btn btn-link btn-xs");
            startButton.Attributes.Add("title", "Start");
            startButton.ServerClick += new EventHandler(BtnStart_Click);
            ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(startButton);
            uPanel.ContentTemplateContainer.Controls.Add(startButton);
        }
    
        // version span
        HtmlGenericControl versionSpan = new HtmlGenericControl("span");
        versionSpan.ID = service.ID + "_version";
        versionSpan.InnerHtml = service.Version;
        versionSpan.Attributes.Add("class", "version-text");
        serviceDiv.Controls.Add(versionSpan);
    

    在Page\u Init中创建这些文件有什么好处?如果我在Page\u Init中创建它们,我如何在Page\u Load中访问它们?私有全局列表 UpdatePanel HtmlButton s觉得很不干净。

    我知道ViewState在Page\u Init和Page\u Load之间加载,但这到底意味着什么?因为我不做完整的回发,而是使用 RegisterAsyncPostBackControl 仅更新 UpdatePanel 在回发中,我不需要在Page\u Load中重新填充吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Markus    7 年前

    如果不需要ViewState,那么也可以在中创建控件 Page_Load 。ViewState用于存储控件的值(哪些值取决于控件),并在回发发送到服务器时使用它们。

    例如,如果您有一个textbox,回发将包含textbox的新值以及ViewState中的旧值。ASP。NET framework现在比较了这两者,并提出了 TextChanged

    关于在ASP中动态创建控件,您可以给出最佳建议。NET WebForms是为了避免使用它们。它们的复杂性增加得很快,但通常不需要(即使一开始看起来是这样)。

    在大多数情况下,有一种更简单的方法,例如使用中继器。在您的情况下,您有一个服务列表。您可以将此列表绑定到中继器,从而避免手动创建控件。看到这个了吗 link

    使用转发器的另一个好处是,可以在ASPX标记中定义UI,而不是在代码隐藏文件中。在您的示例中,您根据服务的状态更改UI。在这种情况下,使用 ItemDataBound -中继器事件可能是一个不错的选择。