FineUI小技巧(6)自定义页面回发

前言

FineUI中的绝大部分回发事件都是由控件触发了,比如按钮的点击事件,下拉列表的改变事件,表格的排序分页事件。但有时我们可能会要自己触发页面回发,这时就要知道怎么使用 JavaScript 来做了,当然这个过程还是 FineUI 所默认支持的AJAX。

手工调用__doPostBack函数

相信每一位使用ASP.NET WebForms的同学都知道这个著名的函数,因为几乎每个页面的源代码中都能看到他的身影:

 1 <script type="text/javascript">
 2 var theForm = document.forms[‘_form1‘];
 3 if (!theForm) {
 4     theForm = document._form1;
 5 }
 6 function __doPostBack(eventTarget, eventArgument) {
 7     if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
 8         theForm.__EVENTTARGET.value = eventTarget;
 9         theForm.__EVENTARGUMENT.value = eventArgument;
10         theForm.submit();
11     }
12 }
13 </script>

这个函数接受两个参数,分别是事件源(eventTarget)和事件参数(eventArgument),用来提交表单(也即页面回发)。

FineUI在页面初始化时会拦截这个函数,并把他改造成AJAX过程,当然这个过程对开发人员是透明的,你依然只需要调用这个函数,整个过程却是FineUI的AJAX形式。

下面看个示例:

  1. 在第一个文本输入框中输入一些字符,并按回车键

     1 <script type="text/javascript">
     2     var textbox1ID = ‘<%= TextBox1.ClientID %>‘;
     3
     4     F.ready(function () {
     5
     6         F(textbox1ID).on("specialkey", function (box, e) {
     7             if (e.getKey() == e.ENTER) {
     8                 __doPostBack(‘‘, ‘TextBox1_ENTER‘);
     9             }
    10         });
    11
    12     });
    13
    14 </script>

    注意其中对__doPostBack的调用,将事件参数定义为TextBox1_ENTER。

  2. 自定义的JavaScript代码会捕获这个事件并回发页面,后台C#代码将第二个文本输入框的值用第一个输入框值填充

     1 protected void Page_Load(object sender, EventArgs e)
     2 {
     3     if (IsPostBack)
     4     {
     5         if (GetRequestEventArgument() == "TextBox1_ENTER")
     6         {
     7             TextBox2.Text = TextBox1.Text;
     8             TextBox2.Focus(true);
     9         }
    10     }
    11 }
    1 public string GetRequestEventArgument()
    2 {
    3     return Request.Form["__EVENTARGUMENT"];
    4 }

    注意,由于没有依附于某个控件的服务器端事件,所以处理放在 if(IsPostBack) 中进行。

手工调用F.customEvent函数

对于上述调用,FineUI进行了简单的封装:由于每个页面都需要PageManager控件,所以可以把让PageManager来处理用户定义回发事件。

现在的代码更清晰了:

  1. 为PageManager定义CustomEvent事件声明,以及处理函数

    <f:PageManager ID="PageManager1" OnCustomEvent="PageManager1_CustomEvent" runat="server" />
    1 protected void PageManager1_CustomEvent(object sender, CustomEventArgs e)
    2 {
    3     if (e.EventArgument == "TextBox1_ENTER")
    4     {
    5         TextBox2.Text = TextBox1.Text;
    6         TextBox2.Focus(true);
    7     }
    8 }
  2. 将对__doPostBack的调用,改为对 F.customEvent 的调用

     1 <script type="text/javascript">
     2     var textbox1ID = ‘<%= TextBox1.ClientID %>‘;
     3
     4     F.ready(function () {
     5
     6         F(textbox1ID).on("specialkey", function (box, e) {
     7             if (e.getKey() == e.ENTER) {
     8                 F.customEvent(‘TextBox1_ENTER‘);
     9             }
    10         });
    11
    12     });
    13
    14 </script>

响应确认对话框的“确定”和“取消”按钮

来看下满足这个常见需求的示例:

  1. 页面上有一个按钮,点击弹出确认对话框

    页面标签如下(注意PageManager的CustomEvent事件和按钮的EnablePostBack参数):

    1 <f:PageManager ID="PageManager1" OnCustomEvent="PageManager1_CustomEvent" runat="server" />
    2 <f:Button Text="操作(点击确定、取消都会回发页面)" runat="server" ID="btnOperation" EnablePostBack="false">
    3 </f:Button>

    按钮的点击事件是在后台通过C#代码注册的JavaScript脚本完成的:

     1 protected void Page_Load(object sender, EventArgs e)
     2 {
     3     if (!IsPostBack)
     4     {
     5         btnOperation.OnClientClick = Confirm.GetShowReference("确认执行操作?",
     6             String.Empty,
     7             MessageBoxIcon.Question,
     8             PageManager1.GetCustomEventReference("Confirm_OK"),
     9             PageManager1.GetCustomEventReference("Confirm_Cancel"));
    10     }
    11 }

    PageManager实例的GetCustomEventReference用来返回页面回发的脚本。

  2. 点击对话框的“确定”和“取消”按钮,都会进行响应

     1 protected void PageManager1_CustomEvent(object sender, CustomEventArgs e)
     2 {
     3     if (e.EventArgument == "Confirm_OK")
     4     {
     5         Alert.Show("执行了确定操作!");
     6     }
     7     else if (e.EventArgument == "Confirm_Cancel")
     8     {
     9         Alert.Show("执行了取消操作!");
    10     }
    11 }

本章小结

本篇文章介绍了如何调用__doPostBack函数进行页面回发,注意这个回发过程已经被FineUI改造成了AJAX。FineUI还提供了F.customEvent函数来取代__doPostBack函数的工作,以便产生更加直观的代码。最后,我们实现了对确认对话框(Confirm)的“确定”和“取消”按钮的响应,同样我们也可以实现对Alert对话框按钮的响应。

源代码与在线示例

本系列所有文章的源代码均可自行下载:http://fineui.codeplex.com/

在线示例:

  1. http://fineui.com/demo/#/demo/other/custom_postback.aspx
  2. http://fineui.com/demo/#/demo/other/custom_postback2.aspx
  3. http://fineui.com/demo/#/demo/other/confirm_cancel2.aspx

如果本文对你有所启发或者帮助,请猛击“好文要顶”,支持原创,支持三石!

FineUI小技巧(6)自定义页面回发

时间: 2024-10-29 19:07:29

FineUI小技巧(6)自定义页面回发的相关文章

FineUI小技巧(5)向子窗口传值,向父窗口传值(另附24张专业版高清大图)

前言 FineUI中经常会用到启用IFrame的Window控件,这样有助于从物理上进行代码解耦和.IFrame的引入就会涉及传值问题,如何在父窗口和子窗口之间相互传值呢? 向子窗口传值 向子窗口传值只需要把要传递的参数放在页面URL中即可,一般有两种做法: 页面回发,在后台通过C#代码拼接需要的URL(推荐做法,方便!) 页面第一次加载时,即注册需要的URL(如果参数是页面上某输入框的值,则需要在URL中嵌入JavaScript代码) 来看一个例子,分别用上述两种方式实现: 页面的初始显示 点

FineUI小技巧(4)关闭窗体那些事(另附24张专业版高清大图)

前言 FineUI中的Window控件常用作选择.新增或编辑内容.而关闭Window控件却有很多技巧,了解这些技巧有助于项目的快速开发. 如何关闭Window控件 第一个问题就是如何关闭Window控件,最明显的方式就是右上角的关闭图标了.总的说来,有三种方式: ESC按键(在Window控件所在页面获取焦点的情况下,按下键盘的ESC将会关闭当前激活窗体) 窗体右上角的关闭图标 用户自定义的关闭按钮 前两种方式自不必说,那么如何自定义关闭按钮呢?有两种做法: 按钮禁用回发,在页面初始化时注册关闭

FineUI小技巧(3)表格导出与文件下载(另附24张专业版高清大图)

需求描述 实际应用中,我们可能需要导出表格内容,或者在页面回发时根据用户权限下载文件(注意,这里的导出与下载,都是在后台进行的,和普通的一个链接下载文件不同). 点击按钮导出表格 由于FineUI 默认支持AJAX,而导出与下载其实是一种破坏AJAX的操作,因为一般的导出代码如下所示: 1 Response.ClearContent(); 2 Response.AddHeader("content-disposition", "attachment; filename=下载的

FineUI小技巧(7)多表头表格导出

前言 之前我们曾写过一篇文章 FineUI小技巧(3)表格导出与文件下载,对于在 FineUI 中导出表格数据进行了详细描述.今天我们要更进一步,介绍下如何导出多表头表格. 多表头表格的标签定义 在 ASPX 中,我们通过 GroupField 列来定义多表头,如下所示: <f:Grid ID="Grid1" Title="表格" EnableCollapse="true" ShowBorder="true" ShowH

iOS开发小技巧--获取自定义的BarButtonItem中的自定义View的方法(customView)

如果BarButtonItem是通过[[UIBarButtonItem alloc] initWithCustomView:(nonnull UIView *)]方法设置的.某些情况下需要修改BarButtonItem中自定义View的某些属性,例如显示的文字或者显示的图片. 可以通过BarButtonItem的customView获取自定义的View.

解决ASP.NET页面回车回发的问题

在asp.net页面中在文本框.按钮等服务器控件上回车都会导致页面回发,网上很多解决方案是使用JS来进行event.keyCode==13判断是否按下的回车键,如果是就event.returnValue = false;  但是这只能适用于IE,有些浏览器是不支持event.keyCode的,例如:火狐就是使用evt.which. 这里给大家一个方案,使用后感觉还行,如果有问题请多多包涵,给出建议: 页面代码: <%@ Page Language="C#" AutoEventWi

页面的回发与回传

页 面事件顺序是固定的,但页面上的控件事件则依靠详细页面和用户的操作.假如控件的AutoPostBack属性配置为true(默认值为false),那 么将立刻惹起页面回发,即页面中各个控件的值回传到Web服务器上,引发相应事件,由事件的处理程序处理.处理完成后假如没有跳转指令,该页面将再此发送 到客户端的阅读器上.假如控件的AutoPostBack属性配置为false,那么它的事件将不会一发生就马上回传,而要等到像Button Click这样的回传事件发生,才一并回传.期间可能有多个事件被暂存在

前端制作之微信小技巧__避免a标签跳转到手机自带浏览器

随着微信的越来越大众化,微信的使用程度也越来越高.随之,产生了一种新的推广模式,即微信推广.在这个微信的大平台上会衍生出许许多多的推广手段.而移动前端作为服务于手机用户的手机网页技术,也不可避免的加入进来. 一些客户不仅仅满足于自己的网站可以在手机浏览器上完美的展现出来,同时还要求可以在微信中进行广泛推广.这就要求移动前端的制作者在制作移动端网站的过程中,还要考虑是否兼容微信的推广. 就制作技术而言,如果可以完美的在手机浏览器中显示,那么在微信推广里也可以完美显示.因为微信中调用的网页引擎就是你

Asp.Net服务器控件开发的Grid实现(四)回发事件

在使用Grid的时候,会用到链接跳转.如果只是普通的链接跳转,那只要使用a标签的href就可以实现.但是有时,我们希望在链接跳转的时候,能够引发回发事件,在后台作出一定的处理,然后再跳转.这样要如何实现呢?我们可以定义一个LinkButtonField来实现.代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text;