当前位置:编程学习 > C#/ASP.NET >>

关于避免后台调用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()%>";
这种方式不建议你用,你可以试着使用隐藏域来保存你想要的值。。然后再获取这个隐藏控件的值 --------------------编程问答--------------------
引用 3 楼  的回复:
var Flag = "<%# ConfirmDo()%>";
这种方式不建议你用,你可以试着使用隐藏域来保存你想要的值。。然后再获取这个隐藏控件的值


我也想过这样做,但是有个问题,比如我在JS中先调用那个后台函数,(这个后台函数完成某些操作并把隐藏域赋值),然后调用隐藏域中的值做判断,接着进行下面的操作。
问题是JS函数中会等待后台函数执行完再向下执行吗? --------------------编程问答--------------------
引用 1 楼  的回复:
在页面放个隐藏文本域
第一 
调用js 赋值给隐藏文本域 值 做判断 后台在给隐藏文本域付初始值
第二 
调用是 再赋值 判断 OK


我也想过这样做,但是有个问题,比如我在JS中先调用那个后台函数,(这个后台函数完成某些操作并把隐藏域赋值),然后调用隐藏域中的值做判断,接着进行下面的操作。
问题是JS函数中会等待后台函数执行完再向下执行吗? --------------------编程问答-------------------- 用AJAX吧

 if (confirm('您是否已对计划中的所有检验工序进行了确认?'))
  {
 var v = document.all("hfdTaskName").value;
    $.post("/api_.ashx", { v: v }, function(data) {
        if (data.sta == "1")
            location.reload();
    }, "json");
}
--------------------编程问答-------------------- 你需要重新理清楚思路,不一定要在js 里去调用后台函数。。。可以js 直接判断后赋值给隐藏域。然后后台去判断隐藏域的值。。。
<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";
                /***************************************************************/
                // 结束任务操作写在这里就可以了
                /***************************************************************/
             }
        }         
}

--------------------编程问答--------------------
引用 9 楼  的回复:
HTML code

<input type='hidden' id='txtStatus' runat='server' value=''/>




C# code

private void btnConfirm_Click(object sender, System.EventArgs e)
{
        Response.write("<script lang……


你好,整个思路我是明白的,关键是我用了JQ组件,不能在后台执行JS,否则会跟JQ冲突。 --------------------编程问答-------------------- 继续顶啊
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,