设置 ASP.NET 按钮属性客户端和读取属性值服务器端
Setting ASP.NET Button attributes client side and read attribute value server side
如何使用 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",则不知何故属性值不会传递给回发操作。
我怎样才能解开这个谜团?
我认为您遇到的问题是因为属性没有被回发以重建其信息服务器端。
控件的状态在服务器端生成,并在提供页面之前存储在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 在客户端修改它,你的控制需要手动处理。
只有表单元素才能实际回发数据。服务器端将获取回发数据并将其加载到表单元素中,前提是设置了 runat=server。
在标记或 HTML 中:
<input type="hidden" runat="server" ID="txtHiddenDestControl" />
JavaScript:
document.getElementById('<%= txtHiddenDestControl.ClientID %>').value = '1';
代码隐藏:
string postedVal = txtHiddenDestControl.Value.ToString();
您可以使用该属性定义 1 个以上的按钮,这些按钮使用相同的 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" />
然后,您可以强制转换"发件人"以获取已单击的按钮,当然还有属性。
在下面的代码中,还有一个 HashSet 来评估是否实现了"属性"的 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;
}
不需要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
}
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 未捕获的类型错误:无法读取属性'删除'的未定义
- AngularJS指令出错-无法读取属性'编译'的未定义
- 未捕获的类型错误:无法读取属性'name'即使它存在,也无法定义
- 看到“;未捕获的类型错误:无法读取属性'weight'未定义的“;尽管按照字面上的指示
- angularjs无法读取未定义的属性then
- 无法读取属性'材料'未定义的Three.js
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- 未捕获的类型错误:无法读取属性'addEventListener'的null chrome扩展名
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- 未捕获的类型错误:无法读取属性'状态'在react中为null
- JavaScript承诺-无法读取属性'那么'的未定义
- Javascript Float32数组抛出无法读取属性'0'即使数组定义良好,也为null
- 未捕获的类型错误:无法读取属性'中止'的未定义
- 角度推入数组给出:TypeError:无法读取属性'推'的未定义
- http/rxjs catch回调中的Angular 2重定向导致TypeError:无法读取属性'订阅'
- 角度输入模型有条件地从一个属性读取,写入另一个属性