我正在使用 WebForms GridView 控件。当用户单击一行上的“更新”时,我想检查他们输入的值与其他一些记录。
从那以后,如果我返回 true,我想显示一个确认对话框,询问用户是否愿意继续更新。
javascript 确认对话框可能不起作用,因为我并不总是想显示此对话框,只有当输入的值满足特定条件时。
有什么建议么?
我建议使用该RowDataBound
事件来检查这些条件并在需要时添加确认对话框。
编辑:比较日期并在它们不同时显示确认
请参阅此jsFiddle进行演示。
<script type="text/javascript">
validateInput = function(inputDate, compareDate, confirmButtonID) {
var confirmButton = document.getElementById(confirmButtonID);
if (confirmButton) {
$(confirmButton).one("click", function() {
var result = dates.compare(inputDate, compareDate);
if (result != 0){ //change to suit your needs
return confirm("Are you sure you want to save these changes?");
}
return true;
});
}
}
</script>
这是dates
用于比较的类的代码(链接):
<script type="text/javascript">
var dates = {
convert:function(d) {
return (
d.constructor === Date ? d :
d.constructor === Array ? new Date(d[0],d[1],d[2]) :
d.constructor === Number ? new Date(d) :
d.constructor === String ? new Date(d) :
typeof d === "object" ? new Date(d.year,d.month,d.date) :
NaN
);
},
compare:function(a,b) {
return (
isFinite(a=this.convert(a).valueOf()) &&
isFinite(b=this.convert(b).valueOf()) ?
(a>b)-(a<b) :
NaN
);
},
inRange:function(d,start,end) {
return (
isFinite(d=this.convert(d).valueOf()) &&
isFinite(start=this.convert(start).valueOf()) &&
isFinite(end=this.convert(end).valueOf()) ?
start <= d && d <= end :
NaN
);
}
}
</script>
在 的RowDataBound
情况下,为每一行GridView
分配函数:onchange
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
var inputCtrl = e.Row.FindControl("txtEnteredDate") as TextBox;
if (inputCtrl != null)
{
var updateButtonCtrl = e.Row.FindControl("btnUpdate") as Button;
if (updateButtonCtrl != null)
{
inputCtrl.Attributes["onchange"] = string.Format("return validateInput(this.value, '{0}', '{1}');", DataBinder.Eval("DateToCompare"), updateButtonCtrl.ClientID);
}
}
}
jQuery 确认对话框
如果您需要比常规 JavaScript 确认对话框更灵活的内容,您可以更改上述内容以使用jQuery UI 对话框作为确认。
如果您使用的是 WebForms (?),则需要向 GridView 模板添加一些验证控件。
这是MSDN中使用的示例CompareValidator
:
<EditItemTemplate>
<asp:TextBox ID="EditUnitPrice" runat="server"
Text='<%# Bind("UnitPrice", "{0:c}") %>'
Columns="6"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server"
ControlToValidate="EditUnitPrice"
ErrorMessage="The price must be greater than or equal to zero and
cannot include the currency symbol"
Operator="GreaterThanEqual" Type="Currency"
ValueToCompare="0">*</asp:CompareValidator>
</EditItemTemplate>