javascript 在客户端设置ASP.NET按钮属性并在服务器端读取属性值

shyt4zoc  于 2023-03-16  发布在  Java
关注(0)|答案(4)|浏览(121)

如何在使用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”,但如果我使用页面检查,则Button2actIndex属性为“2”,不知何故,属性值未传递到postBack操作。
我该如何解开这个谜团?

rsaldnfx

rsaldnfx1#

我认为您遇到的问题是因为属性没有被回发以在服务器端重建它们的信息。
控件的状态是在服务器端生成的,并在提供页面之前存储在ViewState中。然后使用javascript修改值,但由于该值不会回发到服务器,因此无效。在回发时,服务器从已知的ViewState重新生成控件,该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在客户端修改控件,则需要手动处理。

m528fe3b

m528fe3b2#

只有表单元素才能回发数据。2服务器端将接收回发数据并将其加载到表单元素中,前提是runat=server已设置。
在标记或html中:

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

浏览器:

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

代码隐藏:

string postedVal = txtHiddenDestControl.Value.ToString();
6rqinv9w

6rqinv9w3#

您可以使用属性定义1 o个以上的按钮,这些按钮使用相同的OnClick方法(“ButtonSearchName_Click”)。

<asp:Button ID="ButtonSearchName" runat="server" Text="Search Name" 
data-sendto="filter"
OnClick="ButtonSearchName_Click"  />
                     
<asp:Button ID="ButtonSearchName2" runat="server" Text="Search Name" 
data-sendto="form"
OnClick="ButtonSearchName_Click"  />

然后,您可以强制转换“sender”,以获取已单击的按钮,当然还有属性。
在下面的代码中,还有一个HashSet,用于评估“attribute”的VALUE是否实现。
将属性保存到隐藏字段(或其他字段)中以备将来使用。

private readonly HashSet<string> listAttrValues = new HashSet<string>()
{
    "form", "filter"
};

/// <summary>
/// GET 
/// </summary>
protected void ButtonSearchName_Click(object sender, EventArgs e)
{

    // INIT - indica dove scrivere il fornitore selezionato (form/filter)
    hiddenFieldDatagridSendTo.Value = _getAttributeSendTo(sender);
}

/// <summary>
/// GET - attribute
/// </summary>
private string _getAttributeSendTo(object sender)
{
    // GET 
    string retObj = ((Button)sender).Attributes["data-sendto"];
    // CTRL
    if (!listAttrValues.Contains(retObj))
    {
        // ERR
        throw new Exception("Attribute not implemented: " + retObj);
    }
    // RET
    return retObj;
}
mnemlml8

mnemlml84#

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

    }

相关问题