转载请注明出处:果冻栋吖

这个主要是修改H3BPM一个批量审批的功能时候做的。先看下图:

H3自带了批量审批的功能,也就是按钮1,有审批意见3,但是如果3里边不填写内容点击1之后,效果就是表单里边没有任何内容。其次可以依次点击每个表单的提交按钮进行提交。会提交对应的审批意见。现在的需求是:增加一个按钮,但是需要提交所有流程的审批内容,因为他们并不可能完全一样。也就是这里的2。

前台HTML代码:

<asp:LinkButton ID="btnApproveone" runat="server" OnClientClick="btnAllsubmitted()">
<span class="fa fa-check toolImage"></span><span class="toolText">逐个审批</span>
</asp:LinkButton>

主要是JavaScript代码,写了很长时间。第一版,效果是模拟每个任务的提交按钮,用JavaScript定位到对应按钮,然后点击他,这样有一个缺点,就是会默认提示是否提交表单。代码:

function btnAllsubmitted() {
console.log(idValues);
var strs = new Array(); //定义一数组
strs = idValues.split(";"); //字符分割
for (i = 0; i < strs.length; i++) {
//获取到每个流程的id
console.log(strs[i]);
var firstChild = $('#' + strs[i] + ' iframe')[0].contentWindow.$('#ctl00_divTopBars li:first');//用选择器的方式获取第一个子元素--这个当时卡住了
console.log(firstChild);
firstChild.click();
}
}

这里使用了JS获取/设置iframe内对象元素、文档的几种方法---作为参照

这样如果批量审批n个就会提示n个窗口进行确认。

第二版,直接自己写代码进行提交操作,因为原来有一个审批通过全部的按钮,看他的逻辑。可以仿照写:JavaScript代码:

function btnAllsubmitted() {
console.log(idValues);
var idArr = new Array(); //定义一数组
var commentArr = new Array(); //定义一数组
idArr = idValues.split(";"); //字符分割
console.log(idArr);
for (i = 0; i < idArr.length; i++) {
var comment = ($($('#' + idArr[i] + ' iframe')[0].contentWindow.$('.panel-body textarea.inputMouseOut')[1]).val());
commentArr.push(comment);
}
console.log(commentArr);
console.log(idArr);
var jsonObj = [];//创建json
for (var i = 0; i < idArr.length; i++) {
var id = idArr[i];
var comment = commentArr[i];
jsonObj.push({ "key": id, "value": comment });
}
submit(jsonObj);//提交操作
console.log(jsonObj);
}
function submit(jsonObj) { console.log("submit");
console.log(JSON.stringify(jsonObj)); $.ajax({
url: 'MyWorkItemByBatch.aspx?method=submit',
type: 'POST',
data: JSON.stringify(jsonObj),
dataType: 'json',
success: function (dataInfo) {
if (dataInfo.status) {
window.opener.location.reload();
window.opener = null;
window.open('', '_self');
window.close();
} else {
alert(dataInfo.msg);
}
},
async: false
});
}

意思就是:获取每个任务的ID并且获取他iframe下的审批意见对应的内容,这里这个获取也是用到了JavaScript的DOM树操作。重点!

获取到任务的id和审批意见之后,利用Ajax提交到后台进行处理。后台对应的代码:

protected void Page_Load(object sender, EventArgs e)
{
string method = Request.QueryString["method"]; if (!string.IsNullOrEmpty(method))
{
if (method == "submit")
{
bool isok = false;
CommonModel msg = new CommonModel();
var sr = new StreamReader(Request.InputStream);
var stream = sr.ReadToEnd();
JavaScriptSerializer js = new JavaScriptSerializer();
var list = js.Deserialize<List<jsonList>>(stream);
if (list != null && list.Count > )
{
foreach (var item in list)
{
isok = mySubmitWorkItems(item.key, item.value);
if (!isok)
{
break;
}
}
if (!isok)
{
msg.status = false;
msg.msg = "出现异常,请重试!";
object JSONObj = JsonConvert.SerializeObject(msg);
Response.Write(JSONObj);
//一定要加,不然前端接收失败
Response.End();
}
else
{
msg.status = true;
msg.msg = "OK!";
object JSONObj = JsonConvert.SerializeObject(msg);
Response.Write(JSONObj);
//一定要加,不然前端接收失败
Response.End();
}
}
}
} }

重点也是自己不会的地方:这里参考了ASP.NET MVC Controller接收ajax post方式发送过来的json对象或数组数据

if (!string.IsNullOrEmpty(method))
{
if (method == "submit")
{
//获取传输过来的data
var sr = new StreamReader(Request.InputStream);
var stream = sr.ReadToEnd();
JavaScriptSerializer js = new JavaScriptSerializer();
var list = js.Deserialize<List<jsonList>>(stream);
if (list != null && list.Count > )
{
foreach (var item in list)
{
...........
}
}
}
}

这里就是H3的代码了,看不看都行

        /// <summary>
/// 逐个提交已经选中的工作任务
/// </summary>
/// <param name="selectedItems"></param>
/// <param name="commentText"></param>
/// <returns></returns>
private bool mySubmitWorkItems(string id, string comment)
{
string errors = null;
OThinker.H3.WorkItem.WorkItem item = this.Engine.WorkItemManager.GetWorkItem(id);
if (item == null || !item.IsUnfinished)
{
return false;
}
if (item.BatchProcessing == false)
{
errors += item.DisplayName + ";";
return false;
} // 添加意见
this.AppendComment(item, OThinker.Data.BoolMatchValue.True, comment); // 结束工作项
this.Engine.WorkItemManager.FinishWorkItem(
id,
this.UserValidator.UserID,
WorkItem.AccessPoint.Batch,
null,
null,
OThinker.Data.BoolMatchValue.True,
comment,
null,
WorkItem.ActionEventType.Forward,
(int)OThinker.H3.WorkSheet.SheetButtonType.Submit);
// 需要通知实例事件管理器结束事件
Messages.AsyncEndMessage endMessage = new OThinker.H3.Messages.AsyncEndMessage(
Messages.MessageEmergencyType.Normal,
item.InstanceId,
item.ActivityCode,
item.TokenId,
OThinker.Data.BoolMatchValue.True,
false,
OThinker.Data.BoolMatchValue.True,
true,
null);
this.Engine.InstanceManager.SendMessage(endMessage); return true;
}

类代码

    class CommonModel
{
//状态
private bool _statues; public bool status
{
get { return _statues; }
set { _statues = value; }
}
//消息
private string _msg; public string msg
{
get { return _msg; }
set { _msg = value; }
}
//数据
private object _data; public object data
{
get { return _data; }
set { _data = value; }
}
}
public partial class jsonList
{
public string key { get; set; } public string value { get; set; }
}

.NET前后台-JS获取/设置iframe内对象元素并进行数据处理的更多相关文章

  1. JS获取/设置iframe内对象元素、文档的几种方法

    1.IE专用(通过frames索引形象定位): document.frames[i].document.getElementById('元素的ID'); 2.IE专用(通过iframe名称形象定位): ...

  2. 【转】获取/设置IFRAME内对象元素的几种JS方法

    1.IE专用(通过frames索引形象定位): document.frames[i].document.getElementById('元素的ID'); 2.IE专用(通过IFRAME名称形象定位): ...

  3. 设置iframe内表单target属性以兼容IE、Firefox【转载】

    设置iframe内表单target属性以兼容IE.Firefox[转载] 2011年11月19日 haibor       今天有客户反应,在一产品网站的资源下载页面,用户登录提交后页面无反应! 经测 ...

  4. 获取子iframe框架的元素

    我们常常遇到使用iframe框的时候,该iframe框不能根据自己内部的内容撑起来的这种问题 必要条件:不能在跨域的情况下...本地可以放到localhost下进行测试 //父页面index.html ...

  5. 获取iframe内的元素

    $("#iframeID").contents().find("#index_p") 2获取父窗体的值 $('#father', parent.document ...

  6. js获取当前iframe的ID

    self.frameElement.getAttribute('id');其他属性也可以通过这种方式获取. 也可以通过 window.frameElement.id 获取当前iframe的ID

  7. Js脚本选取iframe中的元素

    遇到个小问题,需要用到原生Js处理页面中的元素,以往一个document.getElementById就完活的选取元素,这次却不好使了.. 仔细看代码发现要选取元素外面多了一个iframe标签 < ...

  8. js获取上、下级html元素 js删除html元素方法

    js获取下级html元素:htmlEle.childNode; js获取上级html元素:htmlEle.parentNode; js删除当前html元素: htmlEle.removeNode(tr ...

  9. selenium-java,定位并操作frame和iframe内的元素

    因为frame和iframe的原因,在frame里的元素不能直接定位需要切到相应的frame才可以对元素进行操作,下面是涉及的方法 webDriver.switchTo().defaultConten ...

随机推荐

  1. 【SQL】通过rowid查找及删除重复记录

    新建T表如下: SQL> select * from t; X Y ---------- --          1 a          1 a          1 a          2 ...

  2. mongodb 下载与安装文档

    MongoDB数据库安装及配置环境(windows10系统)   windows10系统下MongoDB的安装及环境配置: MongoDB的安装 下载地址: https://www.mongodb.c ...

  3. POST请求成功,但接口返回数据不正确

    事件:使用Jmeter做APP的搜索接口测试,请求成功了,但无论keyword是什么“内容”(这里的内容是带引号的哦),接口返回的内容都是:未匹配到搜索结果 排查问题: keyword=“世界” st ...

  4. Apex语言(四)选择(决策)结构

    1.选择结构 选择结构是当满足某个条件或不满足某个条件时,需要进行决策以控制执行的流程. 2.if语句 if语句由布尔表达式后跟一个或多个语句组成. [格式] if(条件表达式){ 语句: } [流程 ...

  5. C#使用OracleDataReader返回DataTable

    string data = string.Empty; DataTable OutDataTable = new DataTable(); OracleDataReader daReader = cm ...

  6. linux 中,mysql数据库备份操作

    1.新建一个sh脚本(可以先建一个txt文本,然后改为sh文件). 代码如下: #!/bin/bash #设置mysql备份目录 folder=/**/** cd $folder day=`date ...

  7. 【ZOJ 4070】Function and Function

    [链接] 我是链接,点我呀:) [题意] [题解] 递归一会. 会发现最后肯定是0,1一直循环. 开始循环之后就直接返回结果就好. [代码] #include <bits/stdc++.h> ...

  8. Mysql学习总结(39)——30条MySql语句优化技巧

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  9. 洛谷——P1094 纪念品分组

    https://www.luogu.org/problem/show?pid=1094#sub 题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价 ...

  10. 逻辑斯蒂回归3 -- 最大熵模型之改进的迭代尺度法(IIS)

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用.欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记.所以为 ...