2012年5月7日

【转】ascx + wrapper page + jQuery的Ajax解决方案

 

本篇说明 ashx + jQuery, a lightly ajax solution of asp.net 提到的 ajax 解决方案之五。
首先,请理解什么是 wrapper page。
wrapper page 是定 义的一种专门用来包装用户控件 ascx 的 webform,wrapper page 的 Render 方法被重写(override),仅 render 它的 UserControl 成员。这样,我们就可以通过 ascx 输出干净的 html 片断。是的,我们的目标就是输出干净的 html 片断


实现方法

目标明确了,思路有了,现在让我们来实现吧~
很简单:写一个 Wrapper Page Base,作为所有 wrapper page 的基类,以后的 wrapper page 都从它继承。这个类(WrapperPageBasel类)继承自System.Web.UI.Page类,他只要做两件事情:

  • 拥有一个 UserControl 成员
  • 重写父类(Page)的 Render 方法

那么我们在重写的 Render 方法里执行 UserControl 的 Render 方法即可。请看代码1)

/// <summary>
/// Ajax包装页面基类
/// </summary>
public class WrapperPageBase : System.Web.UI.Page
{
    public UserControl control { get; set; }
 
    protected override void Render(HtmlTextWriter writer)
    {
        if (control == null)
            control = (UserControl)this.LoadControl("~/Controls/dummy.ascx"); // 一个dummy,null时输出server error..之类的信息
 
        control.RenderControl(writer);
    }
}

Wrapper Page继承自WrapperPageBase类:

public partial class Ajax_Test : WrapperPageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.control = (UserControl)this.LoadControl("~/Controls/any.ascx"); // 有用的用户控件           
    }
}

在页面中,使用jQuery异步调用。参看ashx + jQuery, a lightly ajax solution of asp.net 的实例。
你的页面只需要一句话:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Ajax_Test" %>

其余都可以删除。——当然,你也可以不删除,你会发现哪些代码不会出现在页面上。你还可以在同一个 Wrapper Page 里来切换 UserControl,只要判断下query string,像这样:

protected void Page_Load(object sender, EventArgs e)
{
    var str = Request["Want"];
    if(str == "IWantA")
      this.control = (UserControl)this.LoadControl("~/Controls/A.ascx"); // 用户控件A           
    else if(str == "IWantB")
      this.control = (UserControl)this.LoadControl("~/Controls/B.ascx"); // 用户控件A
    else 
      this.control = (UserControl)this.LoadControl("~/Controls/WhatDoYouWant.ascx"); // 用户控件WhatDoYouWant
}

至此,这个解决方案就完成了。


为什么要这么做?

事实上,我们不用 WrapperPageBase,不用重写 Render 方法,简单地把 webform 里的 html 代码全部删掉,再换上我们现在放在 ascx 里的代码,这样也可以达到输出 html 片断的效果。但是为什么要这么麻烦????
理由如下:

  1. 你不用删除 webform 里的那些代码
  2. 你可以不用修改,使用现成的 ascx
  3. 机制是透明的,你只需要 LoadControl
  4. 最后,你完全可以在同一个 webfrom 里根据不同的 query string 来输出不同的 html 片断 —— 哪怕这些片断毫不相干!神奇吧!
1) 代码里指定了一个 dummy,当 dummy.ascx 的内容为空,或者不指定 dummy 时,HtmlTextWriter 会显示一个没有内容但是完整的 html 页面,它不是我们要的 html 片断
 

posted @ 2012-05-07 15:30 kafony 阅读(179) 评论(0) 编辑

【转】ashx+jQuery,一个轻量级的asp.net ajax解决方案

 

shotdog老师研究探讨了下asp.net里,除官方庞大asp.net ajax之外的ajax解决方案。我们想法是以不同的服务器端方式输出,然后在页面使用jQuery的ajax实现调用服务器端几个解决方案:

  • 使用一般的webform,在页面用jQuery ajax调用,再从取得的html数据中取得<body>内的内容,写入DOM
    • 优点:不用改变现有的asp.net开发模式,可以使用现成的页面;ajax取得的内容是html文本,直接写入DOM即可
    • 缺点:内容浪费,<body>之外的内容都不是必要的,而且如果使用了MasterPage那就。。。
  • 使用一般的webform,但是用Response.Write()控制输出html,在页面用jQuery ajax调用,将获取的内容写入DOM
    • 优点:内容干净,不浪费;ajax取得的内容是html文本,可以直接写入DOM
    • 缺点:需要在服务器端以字符串形式构造html文本,编程不方便,不容易调试和维护
  • 使用一般的webform,用Response.Write()控制输出json数据,在页面用jQuery ajax调用,将json数据在客户端加工成html后写入DOM
    • 优点:仅仅交换json数据,极干净,符合高效的web设计理念
    • 缺点:需要在客户端加工json数据,并且对DOM造成入侵
  • 使用asmx,封装成web service,用jQuery ajax调用asmx的内容,将json或者xml数据在客户端加工成html后写入DOM
    • 优点:仅仅交换json或/xml数据,非常干净;web service易于跨平台
    • 缺点:需要在客户端加工json数据,并且对DOM造成入侵
  • 使用自定义控件ascx,然后使用专门的webform页面做wrapper(包装)在页面用jQuery ajax调用wrapper webform,将html数据写入DOM
    • 优点:webform仅仅用作wrapper,根据不同的请求参数可以在wrapper中动态使用自定义控件;自定义控件输出的是html文本,可以直接写入DOM;编程方便,有VS2008代码感知支持,易于调试和维护
    • 缺点:跟传统的webform编程理念不一样,弱化了webform的作用

以上就是讨论的几种可行的方案——不管是asp.net webform方式还是asp.net MVC方式,都是可行的。

昨天晚上又发现一种方案:使用ashx+jQuery .ashx是一个专门的用于处理HttpHandler的文件类型,用来处理自定义Http请求,可以在web.config定义运行时针对ashx的Http请求处理方式。

<add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory" validate="false" />

这样我们就可以用SimpleHandlerFactory来处理ashx的http请求了。在ashx的类中实现IRequiresSessionState接口,using下System.Web.SessionState就可以使用Session了,很方便

using System.Web.SessionState;     
public class checkCookie : IHttpHandler ,IRequiresSessionState
{
  ...  // todo somthing
}

实例:使用ashx+jQuery实现Email存在的验证

.ashx文件

<%@ WebHandler Language="C#" Class="CheckUser" %>
 
using System;
using System.Web;
 
 
public class CheckUser : IHttpHandler {
 
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        context.Response.Write(UserRule.GetInstance().IsUserExist(context.Request["Email"]));
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }
}

html:

   <input type="text" id="email" />
   <input type="button" value="test" onclick="check_email()" />

js:

function check_email() {
    var email = $("#email").attr("value");
    $.get("../ajax/checkuser.ashx",
    { Email: email },
    function(data) {
        window.alert(data);
    });
}

simple的,显然效率会比较高。不过simple的就只能够做点simple的事情。如果要输出 html,还是不太方便。如果要输出html的话,我还是比较倾向于用ascx处理内容,webform做包装所以ashx+jQuery应该算是是一个 asp.net里轻量级的解决方案

 

原文地址:http://blog.csdn.net/allentranks/article/details/3697443

posted @ 2012-05-07 15:28 kafony 阅读(381) 评论(2) 编辑

2012年3月15日

【转】hadoop 报 Name node is in safe mode 错

运行hadoop程序时, 中途我把它终止了,然后再向hdfs加文件或删除文件时,出现Name node is in safe mode错误:
rmr: org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode

解决的命令:

bin/hadoop dfsadmin -safemode leave #关闭safe mode

 

原文地址:http://shutiao2008.iteye.com/blog/318950

posted @ 2012-03-15 22:30 kafony 阅读(23) 评论(0) 编辑

2012年3月12日

【转】Ubuntu11.10下安装Hadoop1.0.0(单机伪分布式)

 

环境配置:Ubuntu11.10,Hadoop1.0.0



安装ssh
1 apt-get install ssh


安装rsync

1 apt-get install rsync


配置ssh免密码登录

1 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
2 cat ~/.ssh/id_dsa.pub >>~/.ssh/authorized_keys


验证是否成功

1 ssh localhost




下载Hadoop1.0.0,JDK

新建 linux 终端,建立app目录,Java和Hadoop都将安装在此目录中。
1 mkdir /home/app


接下来,安装Java和Hadoop,Hadoop解压即可。

1 cd /home/app
2 chmod +x jdk-6u30-linux-i586.bin
3 ./jdk-6u30-linux-i586.bin
4
5 tar zxf hadoop-1.0.0-bin.tar.gz



配置JDK环境变量
1 vi /etc/profile


增加下面语句到最后

1 export JAVA_HOME=/home/app/jdk1.6.0_30
2 export PATH=$JAVA_HOME/bin:$PATH
3 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar


接下来开始配置Hadoop


进入Hadoop目录
1 cd /home/app/hadoop-1.0.0


修改配置文件,指定JDk安装路径

1 vi conf/hadoop-env.sh

1 export JAVA_HOME=/home/app/jdk1.6.0_30


修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号

1 vi conf/core-site.xml

1 <configuration>
2 <property>
3 <name>fs.default.name</name>
4 <value>hdfs://localhost:9000</value>
5 </property>
6 </configuration>


修改Hadoop中HDFS的配置,配置的备份方式默认为3,因为安装的是单机版,所以需要改为1

1 vi conf/hdfs-site.xml

1 <configuration>
2 <property>
3 <name>dfs.replication</name>
4 <value>1</value>
5 </property>
6 </configuration>


修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口

1 vi conf/mapred-site.xml

1 <configuration>
2 <property>
3 <name>mapred.job.tracker</name>
4 <value>localhost:9001</value>
5 </property>
6 </configuration>


接下来,启动Hadoop,在启动之前,需要格式化Hadoop的文件系统HDFS,进入Hadoop文件夹,输入下面命令

1 bin/hadoop namenode -format


然后启动Hadoop,输入命令

1 bin/start-all.sh


这个命令为所有服务全部启动。


最后,验证Hadoop是否安装成功。打开浏览器,分别输入一下网址:

http://localhost:50030 (MapReduce的Web页面)

http://localhost:50070 (HDfS的web页面)

如果都能查看,说明安装成功。





Hadoop分别从三个角度将主机划分为两种角色:

第一,划分为master和slave,即主人与奴隶。

第二,从HDFS的角度,将主机划分为namenode和datanode(在分布式文件系统中,目录的管理很重要,管理目录的就相当于主人,而namenode就是目录管理者)。

第三,从MapReduce的角度,将主机划分为JobTracker和TaskTracker(一个job经常被划分为多个task,从这个角度不难理解它们之间的关系)。

 

 

原文地址:http://my.oschina.net/se77en/blog/38804 

posted @ 2012-03-12 21:29 kafony 阅读(60) 评论(0) 编辑

2011年11月30日

【转】select元素javascript常用操作

东西很简单,只是自己记性不好,经常忘记一些关键字
所以发了点时间整理了一下
/*------------------------------------------------------
*作者:xieyu @ 2007-08-14
*语言:JavaScript
*说明:select元素javascript常用操作
* 1.判断是否存在指定value的Item
* 2.加入一个Item
* 3.删除值为value的所有Item
* 4.删除某一个index的选项
* 5.更新第index项的value和text
* 6.设置select中指定text的第一个Item为选中
* 7.设置select中指定value的第一个Item为选中
* 8.得到当前选中项的value
* 9.得到当前选中项的index
* 10.得到当前选中项的text
* 11.清空所有选项
-------------------------------------------------------*/
//1.判断是否存在指定value的Item
function ExistValue(obj,value){
for(var i=0;i<obj.options.length;i++){
if(obj.options[i].value == value){
return true;
}
}
return false;
}
//2.加入一个Item
function AddItem(obj,text,value){
var varItem = new Option(text,value);
obj.options.add(varItem);
}
//3.删除值为value的所有Item
function RemoveItems(obj,value){
for(var i=0;i<obj.options.length;i++){
if(obj.options[i].value == ItemValue){
obj.options.remove(i);
}
}
}
//4.删除某一个index的选项
function RemoveItem(obj,index){
obj.options.remove(index);
}

//5.更新第index项的value和text
function UpdateItem(obj,index,value,text){
obj.options[index].value = value;
obj.options[index].text = text;
}

//6.设置select中指定text的第一个Item为选中
function SelectItemByText(obj,text){
var isExit = false;
for(var i=0;i<obj.options.length;i++){
if(obj.options[i].text == text){
obj.options[i].selected = true;
return true;
}
}
return false;

}
//7.设置select中指定value的第一个Item为选中
function SelectItemByValue(obj,value){
var isExit = false;
for(var i=0;i<obj.options.length;i++){
if(obj.options[i].value == value){
obj.options[i].selected = true;
return true;
}
}
return false;

}
//8.得到当前选中项的value,index,text
function GetValue(obj){
return obj.value;
}
//9.得到当前选中项的index
function GetIndex(obj){
return obj.selectedIndex;
}
//10.得到当前选中项的text
function GetText(obj){
return obj.options[obj.selectedIndex].text;
}
//11.清空所有选项
function Clear(obj){
obj.options.length = 0;
}

 

 

原文的地址:http://xieyu.blog.51cto.com/213338/38617 

posted @ 2011-11-30 16:02 kafony 阅读(5) 评论(0) 编辑

【转】js获取url传值

js获取url参数值

index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&......

静态html文件js读取url参数 根据获取html的参数值控制html页面输出

一、字符串分割分析法。

  这里是一个获取URL带QUESTRING参数的JAVASCRIPT客户端解决方案,相当于asp的request.querystring,PHP的$_GET

函数:

<Script language="javascript">

function GetRequest() {

var url = location.search; //获取url中"?"符后的字串

var theRequest = new Object();

if (url.indexOf("?") != -1) {

var str = url.substr(1);

strs = str.split("&");

for(var i = 0; i < strs.length; i ++) {

theRequest[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);

}

}

return theRequest;

}

</Script>

然后我们通过调用此函数获取对应参数值:

<Script language="javascript">

var Request = new Object();

Request = GetRequest();

var 参数1,参数2,参数3,参数N;

参数1 = Request['参数1'];

参数2 = Request['参数2'];

参数3 = Request['参数3'];

参数N = Request['参数N'];

</Script>

以此获取url串中所带的同名参数

二、正则分析法。function GetQueryString(name) {

var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)","i");

var r = window.location.search.substr(1).match(reg);

if (r!=null) return unescape(r[2]); return null;

}

alert(GetQueryString("参数名1"));

alert(GetQueryString("参数名2"));

alert(GetQueryString("参数名3"));

 

 

原文地址:http://lce331.blog.163.com/blog/static/838757302010101164724260/ 

posted @ 2011-11-30 16:01 kafony 阅读(194) 评论(0) 编辑

2011年10月8日

【转】Oracle-存取器不是参数存取器

新近写一个vba程序的时分不间歇的出现 “存取器不是参数存取器 ”的错处。嗣后发现至于我等不专业人士,碰到这么的错处还挺e的。下头是综合各种文件理解到的一些货色。
  问题多出现在有乘法也许除法或许其它发作高精度小数的时分,这类错处应该是Oracle和vba里的数据精密度不一致罗致的,Oracle里的数据精密度为38位,而微软VB ADO系统的精密度最高唯其如此支持28位的精密度,招致衔接出了问题。
  当前两个解决方案:
  1. 不用用Oracle客户端自带的 Ole驱动,用微软的 Old驱动。
  Provider=MSDAORA 这个应该是微软提供的驱动解决了数据联接的问题。这个步骤大抵解决了大多数问题,但烦劳取决微软自带的驱动不支持Oracle一些效能,例如调用某些储存进程。
  2. 直接改查询话语,利用trunc和round函数,将全部也许发作高精度数值的结果积极截断。
  select trunc(1.11231234122312, 三) from dual 这个步骤是有效的,但是我觉得很奇怪,上头的截断是用十进制位数,但保留的时分应该是二进制的,十进制的截断代表什么意思呢?

我采用第一种方法解决

原文地址:http://www.wangchao.net.cn/it/detail_59213.html

posted @ 2011-10-08 16:26 kafony 阅读(19) 评论(0) 编辑

2011年9月11日

【转】用C#获取浏览文件夹对话框

摘要: 我们知道,C#里面有选择文件的对话框控件,却没有选择文件夹的对话框控件,不少人为了选择一个文件夹只好自己用TreeView类来处理,其实在C#里面完全不用那么麻烦,我们可以用C#的FolderNameEditor类的子类FolderBrowser类来实现获取浏览文件夹对话框的功能。 下面来看看具体是怎么实现的。 首先新建一个winform的项目,再新建一个类文件(File->AddNewItem->Class)。 因为FolderNameEditor是在System.Windows.Forms.Design命名空间下的,此命名空间位于动态链接库system.design.dll,所阅读全文

posted @ 2011-09-11 10:32 kafony 阅读(294) 评论(3) 编辑

WinForm(C#)复制文件夹

摘要: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace CopyDirectory{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } priva阅读全文

posted @ 2011-09-11 10:28 kafony 阅读(324) 评论(4) 编辑

2011年8月30日

【转】oracle instantclient_11_2 用法

摘要: 首先下一个instantclient_11_2然后找到 D:\Program Files\instantclient_11_2\NETWORK\ADMIN 下tnsnames.ora 如果没有自已配一个,如果有的话更改就可以了。tnsnames.ora里的内容:# tnsnames.ora Network Configuration File: c:\oracle\10.2.0client_1\network\admin\tnsnames.ora# Generated by Oracle configuration tools.ls211=(DESCRIPTION = (ADDRESS_LIS阅读全文

posted @ 2011-08-30 09:47 kafony 阅读(231) 评论(0) 编辑