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

这个主要是修改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. windows server 2012 r2 安装无法找到install.wim 错误代码0x80070026,以及制作U启动盘决解ISO文件超过5G大小限制的解决方案(转)

    戴尔服务器r530 windows server 2012 r2 安装无法找到install.wim 错误代码0x80070026,以及制作U启动盘决解ISO文件超过5G大小限制的解决方案 关于在服务 ...

  2. 时序分析:KMP算法用于序列识别

    考研基础资料之一的<算法与数据结构>,KMP算法作为串匹配的基本算法,为必考题目之一.对于算法入门来说,也是复杂度稍高的一个基本算法. KMP算法作为串匹配的非暴力算法,是为了减少回溯而设 ...

  3. vue系列---identify(生成图片验证码)插件

    identify 这是一个vue的插件,使用canvas来生成图形验证码. 具体参数如下: identify.vue组件(主要用于定义参数和方法) <template> <div c ...

  4. 关于swift 底部工具栏图标锯齿模糊问题。

    今天在底部工具栏添加图片时发现图片模糊而且有锯齿,开始一直以为是美工给的图片有问题,后来发现是要设置两种图片: 比如  index.png(默认30 * 30),indexSelected(选中后的图 ...

  5. HAOI2010软件安装(树形背包)

    HAOI2010软件安装(树形背包) 题意 有n个物品,每个物品最多会依赖一个物品,但一个物品可以依赖于一个不独立(依赖于其它物品)的物品,且可能有多个物品依赖一个物品,并且依赖关系可能形成一个环.现 ...

  6. linux vi面板如何复制一行

    linux vi面板如何复制一行 1)把光标移动到要复制的行上 2)按yy 3)把光标移动到要复制的位置 4)按p

  7. SpringBoot 读取配置文件的值 赋给静态变量

    需求:写了一个工具类,但是工具类中的一些变量需要放到配置文件中,而这个工具类中的变量与方法都是静态的,这个时候我需要一个办法将配置文件中的相关配置读取过来赋值给这些静态变量.找了一些文章,试了一些方法 ...

  8. 使用idea创建maven项目时 需要注意的问题

    截几张图来说明吧 上面的红色框如果不选中  将来创建的工程中没有webapp目录以及下面的子目录 选中之后  然后一直“下一步”  直到工程创建 但是我第一次按照正确的方式操作时  工程中并没有src ...

  9. HRBUST 1214 方格取数

    方格取数 Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged on HRBUST. Original ID: 12 ...

  10. 0919MYSQL中取当前周/月/季/年的第一天与最后一天

    http://blog.csdn.net/cleanfield/article/details/41447585 整理后的sql代码,全部可执行 #当年第一天: SELECT DATE_SUB(CUR ...