设置ASP.NET Button属性客户端和读取属性值服务器端

Cep*_*fan 5 javascript c# asp.net postback custom-attributes

如何Button在使用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>
Run Code Online (Sandbox Code Playgroud)

CodeBehind文件

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"]; 
}
Run Code Online (Sandbox Code Playgroud)

如果我单击Button1然后单击Button2actIndex值仍为"1",但如果我使用页面检查Button2 actIndex属性为"2",则某种方式属性值不会传递给postBack操作.

我该如何解开这个谜团?

Kel*_*sey 4

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

控件的状态是在服务器端构建的,并在ViewState提供页面之前存储在其中。然后,您使用 javascript 修改该值,这没有任何效果,因为该值没有被发送回服务器。在回发时,服务器从已知的控件中重建控件ViewState,该控件具有您最初指定的默认值,即 value 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;
} 
Run Code Online (Sandbox Code Playgroud)

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