1

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

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。为什么我坚持使用第一页加载的初始值?

4

2 回答 2

0

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

于 2013-01-15T21:28:14.807 回答
0

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

问题是由于 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-01-15T21:36:00.733 回答