【问题标题】:Setting ASP.NET Button attributes client side and read attribute value server side设置 ASP.NET 按钮属性客户端和读取属性值服务器端
【发布时间】:2014-10-19 21:14:40
【问题描述】:

如何在使用 javascript 更改属性值后检索 Button 自定义属性?

例子:

Asp 文件

<asp:Button ID="Button1" runat="server" Text="Button1" />
<asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button2_Click" />

<script type="text/javascript">
var btn1 = '#<% Button1.ClientID %>';
var btn2 = '#<% Button2.ClientID %>';

$(btn1).click(function(e) {
    e.preventDefault();
    $(btn2).attr("actIndex", "2");
});

</script>

代码隐藏文件

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        Button2.Attributes.Add("actIndex","1");
}

protected void Button2_Click(object sender, EventArgs e)
{
     Button btn = (Button)sender;

     // this should be 2 if button1 has been clicked
     string actIndex = btn.Attributes["actIndex"]; 
}

如果我点击Button1 然后我点击Button2 actIndex 值仍然是“1”但如果我使用页面检查Button2 actIndex 属性是“2”,不知何故属性值不是传递给 postBack 操作。

我该如何解开这个谜团?

【问题讨论】:

    标签: c# javascript asp.net postback custom-attributes


    【解决方案1】:

    我认为您遇到的问题是因为属性没有被发回以在服务器端重建它们的信息。

    控件的状态是在服务器端构建的,并在提供页面之前存储在ViewState 中。然后,您使用 javascript 修改该值,该值无效,因为该 vaule 没有被发回服务器。在 PostBack 上,服务器从已知的 ViewState 重建控件,该控件具有您最初分配的默认值 1

    要解决这个问题,您需要将值存储在某种类型的控件中(例如HiddenField 控件),该控件将被发送回服务器,然后重建属性服务器端。

    例如(半伪代码):

    // In your javascript write to a hidden control
    $("#yourHiddenFieldControlName").val("2");
    
    // Then in your server side c# code you look for this value on post back and if found,
    // assign it to you attribute
    if (!string.IsNullOrEmpty(yourHiddenFieldControlName.Value))
    {
        Button2.Attributes["actIndex"] = yourHiddenFieldControlName.Value;
    } 
    

    如果您在客户端使用 javascript 修改控件,则需要手动处理。

    【讨论】:

    • 我看过一个例子,你可以编辑 javascript:__postback() 动作并将 actIndex 作为参数发送,但我没有让它工作,所以我会坚持你的想法使用隐藏的输入字段。
    • @CeparuStefan 让我知道它是否不起作用(我已经对其进行了测试,但应该如此)。此外,如果此答案或任何其他答案对您有所帮助,请不要忘记投票/设置接受的答案。欢迎来到 SO :)
    • 你的方法有效。但我不确定这是否是实现我所要求的最佳方式,因此将您的帖子标记为答案是不公平的。我试图给你的帖子一个赞成票,但它没有让我,因为我是这个网站的新手,我没有足够的积分。无论如何,我一直在使用这个解决方案,直到找到更好的解决方案。
    • @CeparuStefan 你最后找到另一个解决方案了吗?
    【解决方案2】:

    只有表单元素才能真正回发数据。如果设置了 runat=server,服务器端将获取回发数据并将其加载到表单元素中。

    在标记或 html 中:

    <input type="hidden" runat="server" ID="txtHiddenDestControl" />
    

    javascript:

    document.getElementById('<%= txtHiddenDestControl.ClientID %>').value = '1';
    

    后面的代码:

    string postedVal = txtHiddenDestControl.Value.ToString();
    

    【讨论】:

      【解决方案3】:

      以下代码无需 Javascript 即可为您工作

       protected void Page_Load(object sender, EventArgs e)
          {
              Button2.Attributes.Add("actIndex", "1");
          }
          protected void Button1_Click(object sender, EventArgs e)
          {
              string Value = Button2.Attributes["actIndex"].ToString();//1
              Button2.Attributes.Remove("actIndex");
              Button2.Attributes.Add("actIndex", "2");
               Value = Button2.Attributes["actIndex"].ToString();//2
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多