从UpdatePanel /调用c# getter永远不会得到更新的数据

Calling C# getter from UpdatePanel / never get updated data

本文关键字:更新 数据 永远 UpdatePanel 调用 getter      更新时间:2023-09-26

我在我的代码后面有这个属性。

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从演示者调用。

在第一个页面加载时,一切按预期工作。setter上的断点首先被击中。然后是getter上的断点。最后,我得到一个javascript警报,其中包含我期望看到的值。

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

如果它仍然在c#中调用属性,那么我不明白为什么更新的值不通过javascript。为什么我被第一个页面加载的初始值卡住了?

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

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

这个问题是由于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>