今天在实现功能:"
在保存数据之前,需要先将数据传送到数据库中进行逻辑验证,如果验证未通过,则需要给出用户一个可以选择“是”与“否”的提示框,如果用户选择了“是”,那么重新保存数据,否则放弃保存数据"时遇到了这个问题,因为这个功能应该也是大家经常会碰到的问是,所以这里也一并讲解下我的实现方法。
首先我是在保存方法中进行逻辑验证,比如保存方法为lbtnSave_Click(object sender, EventArgs e),那么该方法的代码如下:
protected override void lbtnSave_Click(object sender, EventArgs e)
{
if (Request.Form["__EVENTARGUMENT"] == "true")
{
执行保存方法
}
else
{
//这里是逻辑验证代码
if (验证通过)
{
执行保存方法
}
else
{
//验证不通过,则执行页面上的CheckBalanceDate方法,CheckBalanceDate是一个js方法。
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "toopBalanceDate", "CheckBalanceDate('"+行号+"')", true);
}
}
}
CheckBalanceDate方法如下:
function CheckBalanceDate(number) {
if (confirm("第" + number + "行数据的结算日期大于付款日期,是否继续保存?")) {
__doPostBack('ctl00$lbtnSave', 'true') };
}
}
从这里我们就可以明白上面的lbtnSave_Click方法中的if (Request.Form["__EVENTARGUMENT"] == "true")判断是起什么作用了。Request.Form["__EVENTARGUMENT"] == "true",则说明这次回发是用户点了确定后回发回服务器,所以直接执行保存方法。如果Request.Form["__EVENTARGUMENT"] != "true",则说明用户是点击了“保存”按钮进行回发的,所以需要执行判断逻辑。
到这里,好像就已经实现了我要的功能了,但是页面在执行时,会报出:
错误: 对象不支持此属性或方法的错误,跟踪到出错的源,发现是以下代码报错了:
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;;if(!ctl00_ContentPlaceHolder_Content_grid_div.prepareData()){return false;};
return true;
}
上面的代码为asp.net自动生成的页面验证js,估计是因为这个方法中的某个对象还未来的及创建,就已经被调用了。所以我将CheckBalanceDate方法简单修改了一下即可,修改后的代码如下:
function CheckBalanceDate(number) {
if (confirm("第" + number + "行数据的结算日期大于付款日期,是否继续保存?")) {
window.setTimeout(function() { __doPostBack('ctl00$lbtnSave', 'true') }, 0);
}
}
window.setTimeout方法用于在指定的毫秒数后调用函数或计算表达式,即延时执行__doPostBack方法。
注意:即使修改了CheckBalanceDate方法,页面可能还会报出以下错误:
回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
这个错误的解决方法就很简单了,只需在Page的头部增加EnableEventValidation="false"指令即可。