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# コードでゲッターとセッターにブレークポイントを設定しています。

私は MVP を使用しており、セッターはプレゼンターから呼び出されます。

最初のページの読み込みでは、期待どおりに動作します。セッターのブレークポイントが最初にヒットします。次に、ゲッターのブレークポイント。最後に、期待する値を含む JavaScript アラートを受け取ります。

他の更新パネルによってトリガーされる部分的なポストバックで問題が発生しています。それらでは、セッターブレークポイントが新しい値でヒットします。ゲッター ブレークポイントが次にヒットし、すばやく見るSession["LocationOptions"]とそこに新しい値が表示されます。しかし、JavaScript アラートを受け取ると、最初のページ読み込みからの初期値が引き続きアラートされます。

それでもC#でプロパティを呼び出す場合、更新された値がjavascriptに届かない理由がわかりません。最初のページ読み込みからの初期値に固執するのはなぜですか?

4

2 に答える 2

0

私は過去に同じ問題を抱えていました。

この問題は、domが部分的にしか更新されていないためです。私は、ScriptManagerにスクリプトを登録することで、これを個人的に修正しました。

この例は次のとおりです 。ScriptManager.RegisterClientScriptBlockメソッド(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 に答える
0

私の知る限り、部分的に更新されたコンテンツの JavaScript は再実行/再評価されていません。私の理解では、部分的な更新は基本的に DOM を編集してページの一部を更新しますが、これではページ上の JavaScript を動的に更新することはできません。サーバー側で使用ScriptManager.RegisterClientScriptBlockして、部分的なポストバック中に更新された JavaScript を登録できます。

于 2013-01-15T21:28:14.807 に答える