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

这个主要是修改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. 【Oracle】体系结构

    1. 理解实例和数据库 ☞ 实例是一组后台进程和共享内存 ☞ 数据库是磁盘上存储的数据集合 ☞ 实例“一生”只能装载并打开一个数据库 ☞ 数据库可以由一个或多个实例(RAC)装载和打开 [oracle ...

  2. dubbo介绍及实战

    1. dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封 ...

  3. Eclipse之调试代码和返回

    编写代码时,经常会遇到各种莫名其妙的问题,为了检测程序是哪里出现问题,我们通过断点调试来判断哪一步出错 一.断点 在需要断点的地方,在左侧双击鼠标设置断点,可设置多个 去掉断点:在断点上双击一下,没有 ...

  4. Linux各发行版配置总结

    Ubuntu 14.04(该版本下亲测好用) 1.修改开机启动项和默认启动项 sudo gedit /boot/grub/grub.cfg(修改前最好备份一个) 2.登陆界面图片的修改 /usr/sh ...

  5. 【sqli-labs】 less29 GET- Error based -Impidence mismatch -Having a WAF in front of web application (GET型基于错误的带有WAF注入)

    这关有点意思,有一点需要事先注意,这关玩的是login.php而不是默认的index.php 再注入之前需要先了解一下HPP(HTTP Parameter Pollution),详情参照这篇 http ...

  6. 【sqli-labs】 less8 GET - Blind - Boolian Based - Single Quotes (基于布尔的单引号GET盲注)

    加单引号 没有任何信息输出 加and 页面变化,不正常是没有任何回显 http://localhost/sqli/Less-8/?id=1' and '1'='1 http://localhost/s ...

  7. token的问题汇总

    token的作用:认证.授权: 生成:随机码.时间戳.用户 设备 合成: 验证:是否存在.合成验证: 管理:有效期(服务器存储时间or cookie存储过期时间).展期. token生成:或者和用户信 ...

  8. 【转载】JSP 中EL表达式用法详解

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...

  9. apache+php连接数据库

    ######## 安装APACHE ##############安装apr/usr/src/apache+php/tar xf apr-1.5.2.tar.gzcd apr-1.5.2./config ...

  10. MDK(KEIL5)如何生成.bin文件 【转】

    最近要做个bin文件,网上找了好多都说的不够清楚,后来找到一篇实测可用,说明清楚的,转过来以便学习用. 参考传送门:https://blog.csdn.net/nx505j/article/detai ...