C# 设置ASP.NET按钮属性客户端和读取属性值服务器端

C# 设置ASP.NET按钮属性客户端和读取属性值服务器端,c#,javascript,asp.net,postback,custom-attributes,C#,Javascript,Asp.net,Postback,Custom Attributes,使用javascript更改属性值后,如何检索按钮自定义属性 例如: 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 = '#<%

使用javascript更改属性值后,如何检索
按钮
自定义属性

例如:

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”,不知何故,属性值不会传递给回发操作


我怎样才能解开这个谜团呢?

不需要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

    }

我认为您遇到的问题是,没有将属性发回服务器端以重新生成其信息

控件的状态构建在服务器端,并在提供页面之前存储在
ViewState
中。然后使用javascript修改该值,但由于该值没有被发回服务器,因此该值无效。回发时,服务器从已知的
ViewState
重建控件,该控件具有您最初指定的默认值,即值
1

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

eg(半伪码):


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

只有表单元素才能实际回发数据。如果设置了runat=server,服务器端将接收回发数据并将其加载到form元素中

在标记或html中:

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

我看到过一个示例,您可以编辑javascript:_postback()操作并将actIndex作为参数发送,但我还没有使它工作,所以我将坚持您的想法,使用隐藏的输入字段。@CeparuStefan如果不工作,请告诉我(我已经测试过,但应该可以)。此外,如果这个答案或任何其他答案对您有所帮助,请不要忘记更新/设置已接受的答案。欢迎来到SO:)你的方法有效。但是我不确定这是否是实现我所要求的最好的方式,所以把你的帖子作为答案是不公平的。我试图给你的帖子投上一票,但它不允许我,因为我是这个网站的新手,我没有足够的分数。不管怎样,在找到更好的解决方案之前,我一直在使用这个解决方案。@CeparuStefan你找到另一个解决方案了吗?
<input type="hidden" runat="server" ID="txtHiddenDestControl" />
document.getElementById('<%= txtHiddenDestControl.ClientID %>').value = '1';
string postedVal = txtHiddenDestControl.Value.ToString();