【问题标题】:Calling C# getter from UpdatePanel / javascript - never get updated data从 UpdatePanel / javascript 调用 C# getter - 从不获取更新的数据
【发布时间】:2012-12-30 01:13:12
【问题描述】:

我的代码隐藏中有这个属性。

public string LocationOptions
{
    get { return Session["LocationOptions"].ToString(); }
    set { Session["LocationOptions"] = value; }
}

在前端,我有这个 javascript。

<script type="text/javascript">
    function pageLoad(sender, args) {           
        InitLocationsAutoComplete();
    }
</script>

<asp:UpdatePanel ID="upScript" runat="server">
     <ContentTemplate>
         <script type="text/javascript">
            function InitLocationsAutoComplete() {
                var locationsJson = '<%= LocationOptions %>';
                alert(locationsJson);
            }
        </script>
    </ContentTemplate>
</asp:UpdatePanel>

我在 C# 代码中的 getter 和 setter 上设置断点。

我正在使用 MVP,并且 setter 被演示者调用。

在第一页加载时,一切都按预期工作。设置器上的断点首先被击中。然后是getter上的断点。最后,我收到一个带有我希望看到的值的 javascript 警报。

我遇到了由其他更新面板触发的部分回发问题。在那些上,我的 setter 断点命中了一个新值。接下来我的 getter 断点被击中,如果我快速观看Session["LocationOptions"],我会在那里看到新值。但是当我收到 javascript 警报时,它仍然会在第一页加载时提醒初始值。

如果它仍然在 C# 中调用该属性,那么我不明白为什么更新的值没有传递给 javascript。为什么我卡在第一个页面加载时的初始值?

【问题讨论】:

    标签: c# javascript asp.net updatepanel


    【解决方案1】:

    据我所知,部分更新内容中的 javascript 不会重新执行/重新评估。我的理解是,部分更新本质上将编辑 DOM 以更新页面的一部分,但这不允许动态更新页面上的 javascript。您可以在服务器端使用ScriptManager.RegisterClientScriptBlock 在部分回发期间注册您更新的javascript。

    【讨论】:

      【解决方案2】:

      我过去也遇到过同样的问题。

      问题是由于 dom 仅部分更新,我个人已通过在 ScriptManager 中注册脚本来纠正此问题。

      这里有一个例子:ScriptManager.RegisterClientScriptBlock Method (Control, Type, String, String, Boolean)

      <%@ Page Language="C#" %>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      
      <script runat="server">
      protected void Page_PreRender(object sender, EventArgs e)
      {
          string script = @"
          function ToggleItem(id)
            {
              var elem = $get('div'+id);
              if (elem) 
              {
                if (elem.style.display != 'block') 
                {
                  elem.style.display = 'block';
                  elem.style.visibility = 'visible';
                } 
                else
                {
                  elem.style.display = 'none';
                  elem.style.visibility = 'hidden';
                }
              }
            }
          ";
      
          ScriptManager.RegisterClientScriptBlock(
              this,
              typeof(Page),
              "ToggleScript",
              script,
              true);
      }
      
      </script>
      
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head id="Head1" runat="server">
      <title>ScriptManager RegisterClientScriptInclude</title>
      </head>
      <body>
      <form id="Form1" runat="server">
          <div>
              <br />
              <asp:ScriptManager ID="ScriptManager1" 
                                   EnablePartialRendering="true"
                                   runat="server">
              </asp:ScriptManager>
              <asp:UpdatePanel ID="UpdatePanel1" 
                                 UpdateMode="Conditional"
                                 runat="server">
                  <ContentTemplate>
                      <asp:XmlDataSource ID="XmlDataSource1"
                                         DataFile="~/App_Data/Contacts.xml"
                                         XPath="Contacts/Contact"
                                         runat="server"/>
                      <asp:DataList ID="DataList1" DataSourceID="XmlDataSource1"
                          BackColor="White" BorderColor="#E7E7FF" BorderStyle="None"
                          BorderWidth="1px" CellPadding="3" GridLines="Horizontal"
                          runat="server">
                          <ItemTemplate>
                              <div style="font-size:larger; font-weight:bold; cursor:pointer;" 
                                   onclick='ToggleItem(<%# Eval("ID") %>);'>
                                  <span><%# Eval("Name") %></span>
                              </div>
                              <div id='div<%# Eval("ID") %>' 
                                   style="display: block; visibility: visible;">
                                  <span><%# Eval("Company") %></span>
                                  <br />
                                  <a href='<%# Eval("URL") %>' 
                                     target="_blank" 
                                     title='<%# Eval("Name", "Link to the {0} Web site") %>'>
                                     <%# Eval("URL") %></a>
                                  </asp:LinkButton>
                                  <hr />
                              </div>
                          </ItemTemplate>
                          <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
                          <SelectedItemStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
                          <AlternatingItemStyle BackColor="#F7F7F7" />
                          <ItemStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
                          <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
                      </asp:DataList>
                  </ContentTemplate>
              </asp:UpdatePanel>
          </div>
      </form>
      

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2013-03-24
        • 2011-08-16
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多