关于避免后台调用JS的问题
关于检验计划确认一个检验任务下有若干条检验计划
这个问题的业务流程是:点击【确认】,弹出是否确认窗口,点击是则执行相关操作更新数据库等,然后判断这个检验计划是不是其所属检验任务的最后一条,如果是,弹出窗口提示 是否结束XX任务 ,如果选择是,则 结束该任务。
因为我用了JQ组件,所以要避免在后台调用JS,否则JQ组件会失效。
相关代码
//弹出第一个是否窗口
function openchildedit()
{
if (confirm('您是否已对计划中的所有检验工序进行了确认?'))
{
var Flag = "<%# ConfirmDo()%>";
if (Flag == "True")
{
OverTask(document.all("hfdTaskName").value);//hfdTaskName是任务名,此处调用结束检验任务的JS函数
}
else
{
Reshus();//刷新页面
}
}
}
//上面选择是后 后台执行数据库操作 完成确认 然后判断是否需要完成该任务,需要完成返回true 否则返回false
protected bool ConfirmDo()
{
QualityTestingplanInfo model = (new ImpTestingplanDAL()).GetQTPlanInfoByCode(hfdTestingplanInfoPkid.Value);
model.Explain = string.Empty;
if (model.Quality_status == -1)
{
model.Selected_state = 1;
}
model.Quality_status = 1;
model.Modify_emp = staff.LoginId;
model.Modify_date = DateTime.Now;
model.Quality_date = DateTime.Now;
if ((new ImpTestingplanDAL()).Update(model))
{
string sql = "select * from oa_task_info where pk_id ='" + hfdTaskPkid.Value + "'";
DataTable dt = DAL.DbHelperSql.GetDataTable(sql);
if (dt.Rows[0]["flag_struts"].ToString() != "03")
{
sql = "select * from pro_quality_testingplan_info where pro_task_pkid='" + hfdTaskPkid.Value + "' and quality_status!=1 and flag_delete=0";
dt = DAL.DbHelperSql.GetDataTable(sql);
if (dt.Rows.Count <= 0)
return true;
else
return false;
}
else
return false;
}
else
return false;
}
//弹出第二个是否窗口
function OverTask(str) {
if (confirm(str + " 最后一个检测计划已完成,现在结束该任务?")) {
document.all("btnOverTask").click();//调用后台结束任务操作
}
}
我如此写可以避免后台执行JS 但是问题是var Flag = "<%# ConfirmDo()%>";
每次页面加载会自动运行,Page_Load运行完就会执行,这就等于我只要打开这个页面就执行了【确认】操作,这样显然是不对的。
求各位大神帮忙,我该怎么写。 --------------------编程问答-------------------- 在页面放个隐藏文本域
第一
调用js 赋值给隐藏文本域 值 做判断 后台在给隐藏文本域付初始值
第二
调用是 再赋值 判断 OK --------------------编程问答-------------------- 因为你没有return 这个js 方法,自然会执行后台事件。。你的js方法如果是返回true或者false 那么请return。。。
如 function a(){if(...){return true;}else{return false;}}
那么使用这个函数,请这样 onclick="return a();" 这样就不执行后台事件了 --------------------编程问答-------------------- var Flag = "<%# ConfirmDo()%>";
这种方式不建议你用,你可以试着使用隐藏域来保存你想要的值。。然后再获取这个隐藏控件的值 --------------------编程问答--------------------
我也想过这样做,但是有个问题,比如我在JS中先调用那个后台函数,(这个后台函数完成某些操作并把隐藏域赋值),然后调用隐藏域中的值做判断,接着进行下面的操作。
问题是JS函数中会等待后台函数执行完再向下执行吗? --------------------编程问答--------------------
我也想过这样做,但是有个问题,比如我在JS中先调用那个后台函数,(这个后台函数完成某些操作并把隐藏域赋值),然后调用隐藏域中的值做判断,接着进行下面的操作。
问题是JS函数中会等待后台函数执行完再向下执行吗? --------------------编程问答-------------------- 用AJAX吧
--------------------编程问答-------------------- 你需要重新理清楚思路,不一定要在js 里去调用后台函数。。。可以js 直接判断后赋值给隐藏域。然后后台去判断隐藏域的值。。。
if (confirm('您是否已对计划中的所有检验工序进行了确认?'))
{
var v = document.all("hfdTaskName").value;
$.post("/api_.ashx", { v: v }, function(data) {
if (data.sta == "1")
location.reload();
}, "json");
}
<asp:Button ID="BtnRefresh" runat="server" OnClientClick="return a();" OnClick="BtnRefresh_Click" />
--------------------编程问答-------------------- 问题还是没解决啊,我自己顶一个! --------------------编程问答--------------------
function a()
{
if(!confirm(str + " 最后一个检测计划已完成,现在结束该任务?"))
{
//这里不成立就不让它执行后台事件...
return false;
}
else
{
hidden.value =.....//这里给隐藏控件赋值。。。后台可以拿到这个值
return true;
}
}
<input type='hidden' id='txtStatus' runat='server' value=''/>
--------------------编程问答--------------------
private void btnConfirm_Click(object sender, System.EventArgs e)
{
Response.write("<script language='javascript'>if(confirm('您是否已对计划中的所有检验工序进行了确认?')){document.getElementById('txtStatus').value='True';return;}else{document.getElementById('txtStatus').value='False';return;}}</script>");
if(txtStatus.Text=="True")
{
txtStatus.Text = "False";
/***************************************************************/
bool IsTrue = false;
QualityTestingplanInfo model = (new ImpTestingplanDAL()).GetQTPlanInfoByCode(hfdTestingplanInfoPkid.Value);
model.Explain = string.Empty;
if (model.Quality_status == -1)
{
model.Selected_state = 1;
}
model.Quality_status = 1;
model.Modify_emp = staff.LoginId;
model.Modify_date = DateTime.Now;
model.Quality_date = DateTime.Now;
if ((new ImpTestingplanDAL()).Update(model))
{
string sql = "select * from oa_task_info where pk_id ='" + hfdTaskPkid.Value + "'";
DataTable dt = DAL.DbHelperSql.GetDataTable(sql);
if (dt.Rows[0]["flag_struts"].ToString() != "03")
{
sql = "select * from pro_quality_testingplan_info where pro_task_pkid='" + hfdTaskPkid.Value + "' and quality_status!=1 and flag_delete=0";
dt = DAL.DbHelperSql.GetDataTable(sql);
if (dt.Rows.Count <= 0)
{ IsTrue = true; }
}
}
/***************************************************************/
if(IsTrue)
{
Response.write("<script language='javascript'> if(confirm("+str+"'最后一个检测计划已完成,现在结束该任务?')){document.getElementById('txtStatus').value='True';return;}else{document.getElementById('txtStatus').value='False';return;}}</script>");
}
else
{
Response.write("<script language='javascript'>window.location.reload();</script>");
}
if(txtStatus.Text=="True")
{
txtStatus.Text = "False";
/***************************************************************/
// 结束任务操作写在这里就可以了
/***************************************************************/
}
}
}
你好,整个思路我是明白的,关键是我用了JQ组件,不能在后台执行JS,否则会跟JQ冲突。 --------------------编程问答-------------------- 继续顶啊
补充:.NET技术 , ASP.NET