[转载]开源腾讯QQ登录 .Net SDK v1.0 beta (Qzone OAuth Client For Asp.Net )

mikel阅读(927)

[转载]开源腾讯QQ登录 .Net SDK v1.0 beta (Qzone OAuth Client For Asp.Net ) – Hunter.Wei – 博客园.

开源地址:http://qzoneoauth.codeplex.com

示例:http://www.sl8.so

腾讯社区开发平台:http://opensns.qq.com/

腾 讯开放了QQ登录功能,对广大网民是一件大喜事。用户可以从注册、记录杂七杂八的用户名密码中解脱,站长们也可以方便的共享到腾讯的用户。这一天,我们等 你等的好苦:(。第一时间为Silverlight吧申请了QQ登录,但现在腾讯却没提供封装好的.Net SDK,没办法,自己动手,衣丰食足。开发过程中遇到了大大小小的问题,现在的结论要坚信一个真理:腾讯的服务没问题,问题只在我们的程序。即使是返回 12000-13000(服务器出错联系管理员)这类问题,但请相信,服务器正常着呢。为了这个问题,我一度怀疑腾讯服务器咨询腾讯企业QQ,后来千呼万 唤,在我要放弃时得到回复,是我加密有问题,继续Coding,调试。。终成正果。现在已经封装成了组件开源,让后来人在繁琐的认证过程解脱。

  • 封装功能

我们知道腾讯QQ登录要经如下7个步骤:

  1. 请求临时token
  2. 生成未授权的临时token
  3. 引导用户到Qzone的登录页
  4. Qzone引导用户跳转到第三方应用
  5. 请求access token
  6. 生成access token
  7. 访问或修改空间受保护的资源

过程还是比较繁杂的,每个步骤都需要细心,尤其是加密字段的生成。

使用封装好的 QzoneOAuth .Net SDK,你只需如下三个步骤即可完成(确切的说只有两步),无需关注认证的过程。

  1. 配置 Web.config HttpHandler
  2. 调用登录方法
  3. 访问资源

接下来就看看我们如何使用此SDK。

  • 环境准备

开源地址:http://qzoneoauth.codeplex.com

.Net Framework 版本:2.0

  • 使用步骤

SDK里提供了 两个方法和一个属性:

Qzone.OAuth.Utility.Login(string appid, string appkey, string qqcallbackurl, string onSuccessRedirectUrl, string onFailRedirectUrl)

说明:使用腾讯OAuth登录

string Qzone.OAuth.Utility.GetUserInfo(DataFormatEnum format)

说明:获取用户信息

Qzone.OAuth.Utility.OpenId

说明:和QQ号码一一对应的OpenId

1. 配置Web.config

在httpHandlers配置头处理文件地址

<httpHandlers>
<add verb=”*” path=”*/login.axd” type=”Qzone.OAuth.TencentOAuthCallBackHandler, Qzone.OAuth” validate=”false”/>

</httpHandlers>
其中 */login.axd 是可以自由设定的,这个值在登录方法里手工传值(即参数 qqcallbackurl)。

2. 调用登录方法

Qzone.OAuth.Utility.Login(string appid, string appkey, string qqcallbackurl, string onSuccessRedirectUrl, string onFailRedirectUrl)

参数:

appid:即申请QQ登录后分配的app id,六位数字。

appkey:即申请QQ登录后分配的app key,一长串字符串。

qqcallbackurl:用户在登录成功后,由腾讯调转到的地址。就是第一步我们配置的地址:*/login.axd,这里你无需关注,照着写就行了。

onSuccessRedirectUrl:登录完成后调转到网站的地址,这时,从 Qzone.OAuth.Utility.OpenId 属性,你可以得到用QQ号码对应的OpenId,一个号码对应一个OpenId。接下来你就可以自动的在你网站建立对应的用户或者绑定以前的用户了。

onFailRedirectUrl:登录失败调转的地址,此地址用来失败处理提示用户,该地址后附件错误代码,方便查询。

Silverlight吧中的示例:

public partial class tencentlogin : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Qzone.OAuth.Utility.Login(“000000”, “aaaaaaaaaaaaaaaaaaaaaaaaaaaaa”, http://www.sl8.so/login.axd”, “tencentloginsuccess.aspx”, “tencentloginfail.aspx”);
}
}

3.获取用户相关资源

由于其它资源需要认证,现在仅提供获取用户信息方法,此方法不需要进一步认证。

string Qzone.OAuth.Utility.GetUserInfo(DataFormatEnum format)

参数:

format:返回的数据类型,对应xml或者json,具体查看腾讯的看法文档。http://connect.opensns.qq.com/wiki/

在 调转到腾讯的登录界面后,发现它会刷新我们浏览器窗口的大小,说明腾讯在这个步骤是提倡我们用弹出窗口的方式登录的,所以最后是在window.open 里打开登录地址。一句话,现在你需要做的就是:主界面弹出登录窗口—>登录窗口的页面调用Login方法—>在成功后调转的页面绑定用户等操 作、再关掉弹出的窗口并刷新主界面。

  • 后记

1. 请求过程中,在生成oauth_signature参数签名值时,URL编码一定要用大写。

如:GET&http%3a%2f%2fopenapi.qzone…. 要写成 GET&http%3A%2F%2Fopenapi.qzone….

2. 生成oauth_signature的base64编码后需再次URL编码。

3. 请求用户信息后得的的头像是QQ空间的头像,而不是QQ的用户头像。

4. 为了测试的方便,可以修改系统的 hosts 文件。因为腾讯在跳转时,是调转到网站申请的域名,通过修改hosts 文件可以隐射的本机。

如:http://www.sl8.so

hosts 文件:

127.0.0.1 www.sl8.so

当浏览器调转到 http://www.sl8.so/login.axd 时,其实已经隐射到了127.0.0.1本机了。

[转载]Asp.net MVC初次加载时为什么会很慢

mikel阅读(1102)

[转载]Asp.net MVC初次加载时为什么会很慢 – zhoujie – 博客园.

ASP.NET MVC是一个不错的框架,最近开发一直使用。可是最近发现一个问题:MVC初次加载时很慢,有时我在默念计时到6,页面才显示出来,感觉上就比 ASP.NET慢。因为以前的程序都是ASP.NET开发的,两相对比,感觉很明显。不过这只限于第一次,后续访问感觉上又比asp.net快,我想这是 MVC输出的HTML简洁的缘故。

也许你会说,这不成问题,我自己充当第一个访问者就行了。可是问题在于公司的IIS服务器会定期回收应用程序池,一段时间后,又要经历第一次了。

昨天花了点时间翻了一下MVC2的源代码,最后Trace到如下代码是性能瓶颈:位于WebFormViewEngine.cs中的FileExits函数。

protected override bool FileExists(ControllerContext controllerContext, string virtualPath) {
try {
controllerContext.HttpContext.Trace.Write("FileExists");

object viewInstance = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(object));
controllerContext.HttpContext.Trace.Write("FileExistsEnd");

return viewInstance != null;
}
catch (HttpException he) {
if (he.GetHttpCode() == (int)HttpStatusCode.NotFound) {
// If BuildManager returns a 404 (Not Found) that means the file did not exist
return false;
}
else {
// All other error codes imply other errors such as compilation or parsing errors
throw;
}
}
catch {
return false;
}
}

一下是Trace截图:

如果是第一次修改后编译运行,就会收到一个2.46秒的等待!有时会更长,因为我测试的View和Controller都很简单。

原因分析:

ASP.NET MVC 默认其实还是动态编译的,第一次时间都浪费在编译加载上了。

解决方法:

改为预编译。对于IIS定期回收的,还是没有好办法。我只能编个程序每隔20分钟访问一次,让MVC时刻保持活力!哈哈!

如何预编译MVC?

Q: Is there a way to precompile MVC application including code and views for deployment?
A: You need to install the Visual Studio Web Deployment add-in (see http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en)  In your MVC solution, right click on the MVC project and select “Add Web Deployment Project…” (thanks to Jacques) — running the command line utility using aspnet_compiler will also do the job. The command line is:(framework directory)\aspnet_compiler -v /virtualDirName outputdirectoryName

[转载]非常流行的十款 jQuery 插件推荐

mikel阅读(1072)

[转载]非常流行的十款 jQuery 插件推荐 – 梦想天空(山边小溪) – 博客园.

本文列举了10款最流行的 JQuery 插件,有验证用户输入的,有以真正用户友好的方式显示多媒体和图像的,有使数据以可视化的图形和图表的形式展示的等等。相信这十大流行的 JQuery 插件将有助于你的开发项目。

validate

1. Validate

这个 JQuery 插件让琐碎的客户端验证变得简单,提供了大量的定制选项,捆绑了很多有用的验证方法。

EasySlider

2. EasySlider

一款滑动插件,包含自动滑动,连续滑动,首页和末页按钮,垂直互动等,支持在一个页面放置多个滑动。

FancyBox
3. FancyBox

FancyBox 是一个以Mac风格的“lightbox”效果显示图片和其它HTML内容的插件,可自定义Ajax请求和导航。

Progressbar

4. Progressbar

一款很不错的进度条插件,可灵活设置。

Nyro Modal

5. Nyro Modual

NyroModal 是一个基于 jQuery 开发的可以灵活定制的模式弹窗插件。

Pirobox

6. Pirobox

pirobox 是一款可以制作出lightbox效果的jQuery插件。

Flot

7. Flot

Flot 是一个很棒的 jQuery 绘图插件。

Map Hi light

8. Map Hilight

maphilight 是一个高亮显示鼠标悬停区域地图的插件。

Super Fish

9. Super Fish

Superfish 是一个制作 Suckerfish风格菜单的 jQuery 插件。

Accordion

10. Accordion

Accordion 是一款用于制作手风琴效果菜单的 jQuery 插件。

(编译来源:梦想天空 原文来自:10 of the most popular jQuery plugins

[转载].NET实现之(ActiveX插件开发)

mikel阅读(1033)

[转载].NET实现之(ActiveX插件开发) – 南京.王清培 – 博客园.

在打算讲这篇文章之前我深思一个下午,打算分两篇来讲的,但是又怕读者看着嫌烦;其实稍 微了解一点ActiveX插件的朋友都能知道,这样一扯可能出现一堆问题;但是我还是决定通过简单的方式尽量让初学者少接触底层的东西包括OLE(对象连 接与嵌入)、COM(组件对象模型)之类的概念,但是ActiveX插件在开发上有很高的技术要求,虽然.NET为我们封装了很好的实现途径,但是我们也 总不能停留在,知自然而不知其所以然的层面上;今天这篇文章我大概构思了一下,我主要会由浅入深的去逐层的讲解,对一些概念性的东西,我会给出参考资料供 大家去学习,由于它的发展历史我也就不去讲解了,主要是实现为主;如果喜欢刨根问底的朋友可以去查询相关的文章或者看一些关于OLE、COM方面的书籍, 就算我们不从事相关开发,但是对于我们进行.NET互操作方面还是很有帮助的,也不至于让我们觉得.NET的局限性;本人向大家推荐一本OLE方面的好 书:《OLE 2高级编程技术》

其实说起ActiveX插件大家都会想起Flash插件,对Flash插件就是一个很典型的COM组件,宿主在以OLE为容器的Web浏览器应用程 序中,我们把这个OLE容器称为复合文档应用,复合文档应用程序在微软的系统到处可见如:Office就是一个很强大的复合文档应用程序,为什么要称为复 合文档应用程序呢,是因为以容器为宿主的时候,可以进行任何应用集成开发,在office里面我们可以进行图表的编辑、Excel的编辑等等;在这个 OLE中使用的对象严格意思上讲都是COM组件,对COM不了解的朋友可以去看一下《COM本质论》也是一本很好的书籍,其实COM就是组件对象模型,是 二进制的组件,在任何平台任何语言之间都能使用;它是一套组件规范一套开发标准,大家都去遵守这个约定,才能使不同厂商生产的组件互相调用;而 ActiveX插件就是一个COM组件,在早期的开发中对COM的开发是一种望而生畏的感觉,也许我们做.NET开发的程序的感觉开发组件DLL可能并没 有多大难度,不需要去了解一些操作系统底层的东西比如:函数在编译过后重新编码对调用产生的影响,不同操作系统对可执行文件的内存分配回收等等问题,都需 要开发组件的人了如指掌之后才能开发出出色的COM组件,然而在今天我们站在.NET这艘航母上,不需要害怕这些复杂的技术难题,微软为我们打开一扇通往 平坦大道的大门,用最简单的方式去开发最复杂的东西,从某种角度讲是好事,坏事就是让我们越来越远离核心的东西; 这就要看每个人对技术的追求目标了;

由于.NET开发出来的东西都是属于托管的,所以不是正真意义上的二进制标准,这就牵扯到.NET平台调用的技术P/Invoke和互操作 Interop技术,但是我们不了解也没关系,这不影响我们开发ActiveX插件,我只是给大家指一个方向;用.NET开发出来的东西要想完全替代 COM组件,因为OLE容器只接受COM组件才能使用,所以我们的托管DLL文件怎样才能被OLE容器调用呢,就是通过.NET互操作COM来实现,我们 开发的ActiveX插件要被浏览器这么一个大强的复合文档程序加载和使用的,所以我们得将托管的组件包装成非托管的等价的COM组件才行,.NET提供 了CCW(COM可调用包装)的机制,将我们的ActiveX插件通过中间转换一下就可以使用了,理论的东西我就到此结束,我们开始动手做一个 ActiveX插件吧;先看一下ActiveX插件的运行图:

1:

这是系统在运行过程中要经历的过程调用步骤,有助于我们下面的开发讲解;首先是浏览器接受到远程服务器返回的HTML文本,然后浏览器将HTML转 换成DOM对象在通过GDI或者GDI+进行绘制渲染等界面呈现工作,发现在HTML中包含了对本地机器上的COM组件调用,通常也就是我们HTML中的 object标签所定义的说明;在标签中会包含COM组件的唯一标识符GUID(全局唯一ID),在我们机器存在着成千上万个COM组件,只有通过 GUID才能确定是哪一个组件,浏览器通过GUID到注册表中去查找这个COM组件在本机注册时的地址,得到地址后在将其COM组件加载到内容运行;这个 过程被我细化了,只要能说明原理就行了;

下面我们进入到VisualStudio工具进行ActiveX插件开发,我们要新建一个项目这个项目必须得以DLL文件的形式存在,但是要是ActiveX插件必须得有界面啊;所以我们新建一个Windows窗体控件库项目:

2:

新建后会出现一个默认的用户自定义控件我们随便放一个按钮就行了,然后写点测试代码;

3:

每一个ActiveX插件都有一个入口地址,这就是COM入口地址;我们就拿我们上面的这个测试界面作为入口地址;我们切换到代码视图;

4:

我们在这个类的上面添加了两个特性,ComVisible是否对COM公开,这个特性的意思就是说我们的组件是否能用于COM组件的相关调用查找; 如果没有这个特性我们的组件是不能用作COM调用的;GUID特性就是用来为我们的这个类型确定一个部署到客户机器的唯一标识符;这个GUID可以通过 VisualStudio工具栏中的功能自动创建;我们还差一步就成功完成了这么一个庞大的工程了,我们右击项目选择属性会出来下面这个界面:

5:

将为COM互操作注册勾选上,作用就是为了能与COM等组件进行相互调用了,在我们程序目录中会生成一个和组件名称一样的tlb文件,必须有这个文 件我们才能使用这个插件,tlb文件是一个类型库文件,作用就是将托管DLL文件的所有信息导出成COM规范的接口文件,在这个tlb文件中定义了COM 的调用约定;由于COM和.NET组件无法直接交互所以只能通过tlb文件来确定我们的托管的DLL文件中定义哪些东西;我们编译一下;我们还差一个 HTML文件,这个文件随便是来自哪里都可以,这个HTML文件里面要定义调用我们这个ActiveX插件才行;

6:

我红色箭头标记的地方就是Object标记所定义的调用代码,ID就是为调用的ActiveX插件起的一个名字便于在页面中通过JS进行互操 作;CLASSID是要调用的ActiveX插件在用户机器上的GUID唯一标识符;CODEBASE如果用户机器上没有安装这个插件则让浏览器帮忙下载 的URL地址;其他的标记就是和普通的HTML一样的了;在此我穿插一下,所有的HTML标记最终都会被转换成实实在在的对象,而不是我们所谓的HTML 纯文本;

我们保存HTML文件,并且打开这个文件就能看见ActiveX插件被加载运行了;

7:

我这里之间简单的讲解了一下ActiveX插件的基本创建过程,其实ActiveX插件的功能很强大,对B/S一些的功能只能通过插件来解决如:大 文件上传、视频采集、照片动态采集等等;插件在部署的时候一定要注意,部署到用户机器上的时候,在属性栏中有一个文件注册方式,一定要选择为COM注册这 样才能在注册表中添加相应的节点;ActiveX插件开发大概就讲完了;希望讲的还算清晰明了;

[转载]实现软键盘的几个关键技术

mikel阅读(1103)

[转载]实现软键盘的几个关键技术 – eaglet – 博客园.

作者:eaglet

转载请注明出处

在嵌入式应用和一些安全软件中经常需要不通过物理键盘输入,虽然微软提供了也一个软键盘,但这个软件盘不能定制界面不能自动感应当前光标是否处于输入状态,所以有时候我们还是需要自己来实现这个软键盘。本文将讲解自己实现软键盘时涉及到的几个关键技术。

一、浮动窗体的实现

软键盘的窗体和普通窗体不一样,这个窗体在成为当前窗体时,不会影响其它进程的窗体的光标焦点。也就是说虽然这个窗体现在为当前激活的前台窗体,但光标仍然停在其他进程的窗体上。

image

如上图所示,虽然软键盘在记事本的前面,但光标仍然在记事本上。

要实现这个技术,我们必须要把当前窗体设置为浮动工具条才行。这里我给出 C# Winform 的实现方法:

        private const int WS_EX_TOOLWINDOW = 0x00000080;
        private const int WS_EX_NOACTIVATE = 0x08000000;

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= (WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
                cp.Parent = IntPtr.Zero; // Keep this line only if you used UserControl
                return cp;

                //return base.CreateParams;
            }
        }

如上代码就是将 Winform 指定为浮动工具条窗体。只要在winform 的类中重载 CreateParams 函数,并按上述代码编写就可以了。

二、如何检测当前处于输入状态

在一些嵌入式设备中,我们没有物理键盘,所有的输入都是通过触摸屏和软键盘输入。那么这个时候,我们必须要做到只有处于输入状态时才弹出软键盘,否则如果软键盘一直在界面上,既不美观也妨碍其他程序的正常使用。

要实现这个功能,我们能想到的最直接的方法是 windows 是否会在当前处于输入状态下时发一个什么事件,或者通过什么钩子程序来实现。但我研究了很久,没有找到这种方法。如果哪位知道这种方法,不妨在回复中告诉我。

我目前找到的方法是定时询问 windows 的当前窗体是否处于输入状态。

            IntPtr hWnd = GetForegroundWindow();

            uint processId;
            uint threadid = GetWindowThreadProcessId(hWnd, out processId);

            GUITHREADINFO lpgui = new GUITHREADINFO();
            lpgui.cbSize = Marshal.SizeOf(lpgui);

            if (GetGUIThreadInfo(threadid, ref lpgui))
            {
                if (lpgui.hwndCaret != 0)
                {
                    return hWnd;
                }
            }

如上面代码所示

首先我们通过  GetForegroundWindows API 得到当前窗体的句柄。然后我们再通过 GetGUIThreadInfo 得到当前窗体的一些属性。这些属性在 GUITHREADINFO 中定义

        public struct GUITHREADINFO
        {
            public int cbSize;
            public int flags;
            public int hwndActive;
            public int hwndFocus;
            public int hwndCapture;
            public int hwndMenuOwner;
            public int hwndMoveSize;
            public int hwndCaret;
            public System.Drawing.Rectangle rcCaret;
        }

上面是  GUITHREADINFO  结构。我们可以通过这个信息得到当前窗体中当前焦点的子窗口句柄,当前获得光标的子窗口句柄,当前正激活的子窗体句柄等等。这里我们只要用到当前获得光标 的子窗口句柄,就是 hwndCaret 。如果hwndCaret 不为0,则表示当前窗体处于可输入状态。

相关API函数的 C# 定义如下:

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetGUIThreadInfo(uint idThread, ref GUITHREADINFO lpgui);
        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

三、模拟键盘输入

模拟键盘输入比较简单,.Net 提供了一个静态函数来模拟键盘输入

System.Windows.Forms.SendKeys.Send

这个函数很简单,而且微软的帮助也很全面了,我这里就不多说了。

另外我们还可以用更加底层的 API 函数来模拟键盘的输入

        [DllImport("user32.dll")]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags,
           int dwExtraInfo);

这个函数是 keybd_event,关于这个函数的使用,微软的帮助也写的很清楚,这里也不重述了。

[转载]Python 和 PyGame 的一些示例

mikel阅读(1197)

[转载]Python 和 PyGame 的一些示例 | 酷壳 – CoolShell.cn.

看到一个网页收集了很多使用Python和PyGame写游戏的示例,分享给大家。(注:我不知道用Python/PyGame写游戏其性能会怎么样,但是一些小游戏应该是没有问题的)

这个网页同时给了一本介绍Python和PyGame的电子书(PDF),下面的这些例子就是这本书的示例。所有的这些示例可以打包下载

基础 Python 示例

Pygame 图形示例

pygame_base_template.py – 开启一个黑的 pygame 窗口。当你要写一个新的代码时,你可以使用这个示例的代码初始化你的程序。
simple_graphics_demo.py – 作图,画一些简单的图形。 simple_graphics_demo_thumb.png

functions_and_graphics.py – 图一些雪人。
animating_snow.py – 下雪动画。 Animating Snow
move_keyboard.py – 使用键盘移动一个图形move_mouse.py – 使用鼠标移动一个图形

move_game_controller.py – 使用游戏手柄移动一个图形

bitmapped_graphics.py – 显示一些图片(png, jpb),并加入一些声音。
array_backed_grid.py – 一个网格,可以用来开发一些棋类的游戏。

Pygame 示例

sprite_collect_blocks.py – 使用鼠标移动一个小点
sprite_collect_circle.py – 和上面的示例一样,只不过是圆点。
sprite_collect_graphic.py – 和上面的示例一样,只不过是图片。
move_sprite_mouse.py – 用鼠标移动一个点move_sprite_keyboard_jump.py – 用键盘移动一个点(跳动式的)

move_sprite_keyboard_smooth.py – 用键盘移动一个点(平滑式的).

move_sprite_game_controller.py – 用游戏手柄移动一个点

move_with_walls_example.py – 移动一个点,但是会被墙阻止。

游戏示例

bounce_ball_with_paddle.py – 两个玩家玩对碰球游戏,需要两个手柄。
breakout_simple.py – 一个简单的游戏,显示 “Game Over” 信息.
一个学生的作业. Spring 2011
另一个学生的作业. Fall 2010Download games – .

创建一个安装包

Python Pygame 安装包教程

搜索和排序示例

文件示例

high_score.py – Example that shows how to read and write a high score to the disk so that it persists between program runs.

其它信息

[转载]ASP.NET MVC HtmlHelper用法大全

mikel阅读(930)

[转载]ASP.NET MVC HtmlHelper用法大全 – 城堡没公主 – 博客园.

HTML扩展类的所有方法都有2个参数:
以textbox为例子
public static string TextBox( this HtmlHelper htmlHelper, string name, Object value, IDictionary<string, Object> htmlAttributes )
public static string TextBox( this HtmlHelper htmlHelper, string name, Object value, Object htmlAttributes )
这2个参数代表这个html标签的属性集合。使用方法如下。
1.ActionLink
<%=Html.ActionLink(“这是一个连接”, “Index”, “Home”)%>
带有QueryString的写法
<%=Html.ActionLink(“这是一个连接”, “Index”, “Home”, new { page=1 },null)%>
<%=Html.ActionLink(“这是一个连接”, “Index”, new { page=1 })%>
有其它Html属性的写法
<%=Html.ActionLink(“这是一个连接”, “Index”, “Home”, new { id=”link1″ })%>
<%=Html.ActionLink(“这是一个连接”, “Index”,null, new { id=”link1″ })%>
QueryString与Html属性同时存在
<%=Html.ActionLink(“这是一个连接”, “Index”, “Home”, new { page = 1 }, new { id = “link1” })%>
<%=Html.ActionLink(“这是一个连接”, “Index” , new { page = 1 }, new { id = “link1″ })%>

生成结果为:
<a href=”/”>这是一个连接</a>
带有QueryString的写法
<a href=”/?page=1″>这是一个连接</a>
<a href=”/?page=1″>这是一个连接</a>
有其它Html属性的写法
<a href=”/?Length=4″ id=”link1″>这是一个连接</a>
<a href=”/” id=”link1″>这是一个连接</a>
QueryString与Html属性同时存在
<a href=”/?page=1″ id=”link1″>这是一个连接</a>
<a href=”/?page=1″ id=”link1″>这是一个连接</a>

2.RouteLink
跟ActionLink在功能上一样。
<%=Html.RouteLink(“关于”, “about”, new { })%>
带QueryString
<%=Html.RouteLink(“关于”, “about”, new { page = 1 })%>
<%=Html.RouteLink(“关于”, “about”, new { page = 1 }, new { id = “link1″ })%>

生成结果:
<a href=”/about”>关于</a>
<a href=”/about?page=1″>关于</a>
<a href=”/about?page=1″ id=”link1″>关于</a>
3.Form 2种方法
<%using(Html.BeginForm(“index”,”home”,FormMethod.Post)){%>
<%} %>

<%Html.BeginForm(“index”, “home”, FormMethod.Post);//注意这里没有=输出%>
<%Html.EndForm(); %>

生成结果:
<form action=”/home/index” method=”post”></form>
4.TextBox , Hidden ,
<%=Html.TextBox(“input1”) %>
<%=Html.TextBox(“input2”,Model.CategoryName,new{ @style = “width:300px;” }) %>
<%=Html.TextBox(“input3”, ViewData[“Name”],new{ @style = “width:300px;” }) %>
<%=Html.TextBoxFor(a => a.CategoryName, new { @style = “width:300px;” })%>

生成结果:

<input id=”input1″ name=”input1″ type=”text” value=”” />
<input id=”input2″ name=”input2″ style=”width:300px;” type=”text” value=”Beverages” />
<input id=”input3″ name=”input3″ style=”width:300px;” type=”text” value=”” />
<input id=”CategoryName” name=”CategoryName” style=”width:300px;” type=”text” value=”Beverages” />

5.TextArea
<%=Html.TextArea(“input5″, Model.CategoryName, 3, 9,null)%>
<%=Html.TextAreaFor(a => a.CategoryName, 3, 3, null)%>

生成结果:
<textarea cols=”9″ id=”input5″ name=”input5″ rows=”3″>Beverages</textarea>
<textarea cols=”3″ id=”CategoryName” name=”CategoryName” rows=”3″>Beverages</textarea>

6.CheckBox
<%=Html.CheckBox(“chk1”,true) %>
<%=Html.CheckBox(“chk1″, new { @class=”checkBox”}) %>
<%=Html.CheckBoxFor(a =>a.IsVaild, new { @class = “checkBox” })%>

生成结果:

<input checked=”checked” id=”chk1″ name=”chk1″ type=”checkbox” value=”true” /><input name=”chk1″ type=”hidden” value=”false” />

<input class=”checkBox” id=”chk1″ name=”chk1″ type=”checkbox” value=”true” /><input name=”chk1″ type=”hidden” value=”false” />

<input checked=”checked” class=”checkBox” id=”IsVaild” name=”IsVaild” type=”checkbox” value=”true” /><input name=”IsVaild” type=”hidden” value=”false” />

7.ListBox
<%=Html.ListBox(“lstBox1”,(SelectList)ViewData[“Categories”])%>
<%=Html.ListBoxFor(a => a.CategoryName, (SelectList)ViewData[“Categories”])%>

生成结果:
<select id=”lstBox1″ multiple=”multiple” name=”lstBox1″>
<option value=”1″>Beverages</option>
<option value=”2″>Condiments</option>
<option selected=”selected” value=”3″>Confections</option>
<option value=”4″>Dairy Products</option>
<option value=”5″>Grains/Cereals</option>
<option value=”6″>Meat/Poultry</option>
<option value=”7″>Produce</option>
<option value=”8″>Seafood</option>
</select>
<select id=”CategoryName” multiple=”multiple” name=”CategoryName”>
<option value=”1″>Beverages</option>
<option value=”2″>Condiments</option>
<option value=”3″>Confections</option>
<option value=”4″>Dairy Products</option>
<option value=”5″>Grains/Cereals</option>
<option value=”6″>Meat/Poultry</option>
<option value=”7″>Produce</option>
<option value=”8″>Seafood</option>
</select>

8.DropDownList
<%= Html.DropDownList(“ddl1”, (SelectList)ViewData[“Categories”],  “–Select One–“)%>
<%=Html.DropDownListFor(a => a.CategoryName, (SelectList)ViewData[“Categories”], “–Select One–“, new { @class = “dropdownlist” })%>

生成结果:
<select id=”ddl1″ name=”ddl1″>
<option value=””>–Select One–</option>
<option value=”1″>Beverages</option>
<option value=”2″>Condiments</option>
<option selected=”selected” value=”3″>Confections</option>
<option value=”4″>Dairy Products</option>
<option value=”5″>Grains/Cereals</option>
<option value=”6″>Meat/Poultry</option>
<option value=”7″>Produce</option>
<option value=”8″>Seafood</option>
</select>
<select class=”dropdownlist” id=”CategoryName” name=”CategoryName”>
<option value=””>–Select One–</option>
<option value=”1″>Beverages</option>
<option value=”2″>Condiments</option>
<option value=”3″>Confections</option>
<option value=”4″>Dairy Products</option>
<option value=”5″>Grains/Cereals</option>
<option value=”6″>Meat/Poultry</option>
<option value=”7″>Produce</option>
<option value=”8″>Seafood</option>
</select>

9.Partial 视图模板
webform里叫自定义控件。功能都是为了复用。但使用上自定义控件真的很难用好。
<% Html.RenderPartial(“DinnerForm”); %>  看清楚了没有等号的。

[转载]返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model

mikel阅读(1119)

[转载]返璞归真 asp.net mvc (8) – asp.net mvc 3.0 新特性之 Model – webabcd – 博客园.

[索引页]
[源码下载]

返璞归真 ASP.NET mvc (8) – ASP.NET mvc 3.0 新特性之 Model

作者:webabcd

介绍
ASP.NET mvc 之 ASP.NET MVC 3.0 新特性之 Model:

  • 通过 Data Annotations 与 JQuery 的结合实现服务端和客户端的双重验证
  • 双重验证中,使客户端实现远程的异步验证
  • 自定义 Data Annotations 与 JQuery,以实现自定义的双重验证

示例
1、Model 中通过 Data Annotations 与 JQuery 的结合实现服务端和客户端的双重验证
Web.config


<!--         要实现服务端和客户端的双重验证,需要做如下配置,因为双重验证中的客户端验证需要依赖此配置     -->

User.cs

/*
* 在 asp.net mvc 3.0 中支持通过 Data Annotations 来实现服务端和客户端的双重验证,需要 jQuery 的支持
* 所有 Data Annotations 相关的 Attribute 直接用类视图看 System.ComponentModel.DataAnnotations 就行了,详细说明以前写过好多遍了,这里就不重复了
* 另外 System.Web.Mvc 下有一些新增的 Data Annotations
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace MVC30.Models
{
public class User
{
public int ID { get; set; }

[DisplayName("名字")]
[Required(ErrorMessage = "名字不能为空")]
public string Name { get; set; }

[DisplayName("密码")]
[Required(ErrorMessage = "密码不能为空")]
public string Password { get; set; }

[DisplayName("确认密码")]
[Required(ErrorMessage = "确认密码不能为空")]
[Compare("Password", ErrorMessage="两次密码输入不一致")]
public string ConfirmPassword { get; set; }

public DateTime DateOfBirth { get; set; }

// 请求时,允许此字段包含 HTML 标记
[AllowHtml]
public string Comment { get; set; }
}
}

Validation_DataAnnotations.cshtml

@model MVC30.Models.User

@{
ViewBag.Title = "Validation_DataAnnotations";
}
<h2>ClientValidation</h2>
<!--     通过 jQuery 实现客户端验证的逻辑,需要引用此 js -->
<script src="@Url.Content(" type="text/javascript"></script> <!--     服务端验证与客户端验证的一一对应需要引用此 js --> <script src="@Url.Content(" type="text/javascript"></script>

@*
在 MVC3 中实现客户端验证,不需要添加以下代码
@{ Html.EnableClientValidation(); }
*@

@using (Html.BeginForm())
{
<fieldset> <legend>User</legend>
<div class="editor-label">@Html.LabelFor(model =&gt; model.Name)
(测试方法:空着文本框,然后提交)</div>
<div class="editor-field">@Html.EditorFor(model =&gt; model.Name)
@Html.ValidationMessageFor(model =&gt; model.Name)</div>
<input type="submit" value="Create" /></fieldset>
}

2、Model 中通过 Data Annotations 与 jQuery 的结合实现服务端和客户端的双重验证,其中客户端可以实现远程的异步验证
User.cs

/*
* System.Web.Mvc.Remote(string action, string controller) - 让客户端可以通过 ajax 的方式远程验证
*     action - 实现验证逻辑的 action,即处理客户端的异步请求的 action
*     controller - 实现验证逻辑的 controller,即处理客户端的异步请求的 controller
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace MVC30.Models
{
public class User
{
public int ID { get; set; }

[DisplayName("名字")]
[Required(ErrorMessage = "名字不能为空")]
[Remote("CheckUserNameExists", "ValidationDemo", ErrorMessage = "名字已存在")]
public string Name { get; set; }

[DisplayName("密码")]
[Required(ErrorMessage = "密码不能为空")]
public string Password { get; set; }

[DisplayName("确认密码")]
[Required(ErrorMessage = "确认密码不能为空")]
[Compare("Password", ErrorMessage="两次密码输入不一致")]
public string ConfirmPassword { get; set; }

public DateTime DateOfBirth { get; set; }

// 请求时,允许此字段包含 HTML 标记
[AllowHtml]
public string Comment { get; set; }
}
}

3、Model 中使用更多的 Data Annotations 以及实现自定义的 Data Annotations 和自定义 jQuery 的相关逻辑
User.cs

/*
* 如何使用更多的 Data Annotation
*     1、在“Tools”中选择“Extension Manager”(安装 NuGet 后会有此选项)
*     2、搜索“DataAnnotationsExtensions”,然后安装“DataAnnotationsExtensions.MVC3”项目
*     3、之后就可以使用此项目所支持的多个新的 Data Annotation
* 如何自定义 Data Annotation
*     详见:IntegerAttribute.cs
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace MVC30.Models
{
public class User
{
public int ID { get; set; }

[DisplayName("名字")]
[Required(ErrorMessage = "名字不能为空")]
[Remote("CheckUserNameExists", "ValidationDemo", ErrorMessage = "名字已存在")]
public string Name { get; set; }

[DisplayName("密码")]
[Required(ErrorMessage = "密码不能为空")]
[Integer(ErrorMessage = "密码必须是整型")]
public string Password { get; set; }

[DisplayName("确认密码")]
[Required(ErrorMessage = "确认密码不能为空")]
[Compare("Password", ErrorMessage="两次密码输入不一致")]
public string ConfirmPassword { get; set; }

public DateTime DateOfBirth { get; set; }

// 请求时,允许此字段包含 HTML 标记
[AllowHtml]
public string Comment { get; set; }
}
}

IntegerAttribute.cs

/*
* 自定义 Data Annotation,以实现与 jQuery 结合的客户端和服务端双重验证
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
using System.Web.Mvc;

namespace MVC30.Models
{
// 继承 ValidationAttribute 抽象类,重写 IsValid() 方法,以实现服务端验证
// 实现 IClientValidatable 接口的 GetClientValidationRules() 方法,以实现客户端验证
public class IntegerAttribute : ValidationAttribute, IClientValidatable
{
// 服务端验证逻辑,判断输入是否为整型
public override bool IsValid(object value)
{
var number = Convert.ToString(value);
return Regex.IsMatch(number, @"^[0-9]+$");
}

// 客户端验证逻辑,需要结合客户端验证代码,详见 Validation_Custom.cshtml 文件
public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,

// ValidationType - 指定一个 key(字符串),该 key 用于关联服务端验证逻辑与客户端验证逻辑。注:这个 key 必须都是由小写字母组成
ValidationType = "isinteger"
};

// 向客户端验证代码传递参数
rule.ValidationParameters.Add("param1", "value1");
rule.ValidationParameters.Add("param2", "value2");

yield return rule;
}
}
}

ValidationDemoController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using MVC30.Models;

namespace MVC30.Controllers
{
public class ValidationDemoController : Controller
{
// 用于演示如何使用更多的 Data Annotations 来实现服务端和客户端的双重验证,以及如何自定义 Data Annotations 来实现服务端和客户端的双重验证
public ActionResult Validation_Custom()
{
var user = new User { ID = 1, Name = "webabcd", DateOfBirth = new DateTime(1980, 2, 14), Comment = "<strong>mvp</strong>" };

return View(new User());
}

[HttpPost]
public ActionResult Validation_Custom(User user)
{
return View(user);
}
}
}

Validation_Custom.cshtml

@model MVC30.Models.User

@{
ViewBag.Title = "ClientValidation";
}
<h2>ClientValidation</h2>
<script src="@Url.Content(" type="text/javascript"></script> <script src="@Url.Content(" type="text/javascript"></script>

<script type="text/javascript">// <!&#91;CDATA&#91;
    // 客户端验证逻辑,判断输入是否为整型
    jQuery.validator.addMethod(
        'checkInteger',
        function (value, element) {
            var reg = new RegExp("^&#91;0-9&#93;+$");
            return (reg.test(value));
        }
    );

    // 将客户端验证逻辑通过 ValidationType 与服务端的相关验证逻辑结合起来
    jQuery.validator.unobtrusive.adapters.add(
        'isinteger', // ValidationType,必须全为小写
        &#91;'param1', 'param2'&#93;, // 接收 ModelClientValidationRule 中的参数信息
        function (options) {
            options.rules&#91;'checkInteger'&#93; = true; // 启用名为 checkInteger 的客户端验证逻辑
            options.messages&#91;'checkInteger'&#93; = options.message; // 发生验证错误后的显示信息
            var param1 = options.params.param1; // ModelClientValidationRule 中的参数信息
            var param2 = options.params.param2; // ModelClientValidationRule 中的参数信息
            alert(param1 + " " + param2);
        }
    );
// &#93;&#93;></script>

@using (Html.BeginForm())
{
<fieldset> <legend>User</legend>
<div class="editor-label">@Html.LabelFor(model =&gt; model.Name)</div>
<div class="editor-field">@Html.EditorFor(model =&gt; model.Name)
@Html.ValidationMessageFor(model =&gt; model.Name)</div>
<div class="editor-label">@Html.LabelFor(model =&gt; model.Password)
(测试方法:在文本框中输入非整型的字符串)</div>
<div class="editor-field">@Html.EditorFor(model =&gt; model.Password)
@Html.ValidationMessageFor(model =&gt; model.Password)</div>
<input type="submit" value="Create" /></fieldset>
}

源码下载:
[源码下载]

转载asp.net MVC中使用自定义HtmlForm控件动态生成表单

mikel阅读(781)

转载asp.net MVC中使用自定义HtmlForm控件动态生成表单 – zhoujie – 博客园.

经测试System.Web.UI.HtmlControls下的HtmlForm类,也就是我们在传统的ASP.NET中使用的Form表单对象,不适合动态生成Html代码。

于是自定义了一个简单的HtmlForm容器控件,只需要几行代码。看来ASP.NET在封装Html元素方面还是很有优势的,微软为我们定义了

大量的基础结构,很容易扩展使用。

public class myHtmlForm:HtmlContainerControl
{
public myHtmlForm()
: base("form")
{

this.Attributes.Add("method", "post");
}

public string Action
{
set
{
Attributes.Add("action", value);
}
}
}

使用很简单,直接new,然后向Controls集合中添加控件即可。

myHtmlForm form = new myHtmlForm();
form.ID = "myform";
form.Action = "test.aspx";
HtmlInputHidden hidf= new HtmlInputHidden();
hidf.ID = hidf.Name = "hidden";
form.Controls.Add(hidf);

最后在View中,输出HTML代码到响应流。

form.RendControl(Writer);

结论:

动态生成HTML表单就是这么简单明了。我以前可是自己拼接过HTML,然后Write啊。善于利用框架提供的类可以有效的提高开放效率,

并且使代码的可读性良好。尤其是在做表格控件时,善用System.Web.UI.WebControls.Table控件,会很有帮助。很想知道PHP或其他

语言是否也有这些好用的基础设施呢?

[转载]非常棒的 ASP.NET Web Forms 和 ASP.NET MVC 免费培训视频

mikel阅读(875)

[转载]非常棒的 ASP.NET Web Forms 和 ASP.NET MVC 免费培训视频! – 冠军 – 博客园.

原文名称:Great Free Video Training on ASP.NET Web Forms and ASP.NET MVC

原文地址:http://weblogs.asp.net/scottgu/archive/2011/05/15/great-free-video-training-on-asp-net-web-forms-and-asp-net-mvc.aspx

最近我们在 http://asp.net 站点上发布了许多很棒的 ASP.NET 培训视频。

这些很棒的视频由  Pluralsight (一 个很棒的 .NET 培训公司) 创建,现在免费提供以供学习或者更新你的 ASP.NET Web Forms4 和 ASP.NET MVC 知识。每个课程由一个培训讲师讲授,提供了从始至终的学习课程(从基本的概念到使用新的 EF 代码优先、安全、发布和测试)。

下面是这周末我们发布的这两个免费培训课程的一些详细介绍,包括如何观看的链接。

ASP.NET MVC3 培训

这周末我们发布了由 K Scott Allen 讲授的新的 ASP.NET MVC3 培训课程,这个课程由 10 个部分组成,现在你可以从 http://asp.net 页面免费观看整个系列的课程(在页面左边的 Essential Videos 部分)。

下面是 ASP.NET MVC3 这个课程系列的十个部分:

  1. 介绍 (35 分钟)
  2. 控制器 (35 分钟)
  3. Razor 视图引擎 (45 分钟)
  4. 使用数据: Entity Framework 代码优先 (39 分钟)
  5. 使用数据: 验证和映射 (33 分钟)
  6. Javascript, jQuery and Ajax (47 分钟)
  7. 安全 (43 分钟)
  8. 缓存, 本地化, 资源和诊断 (34 分钟)
  9. 单元测试 (37 分钟)
  10. 发布和配置 (37 分钟)

ASP.NET Web Forms 4 培训

Dan Wahlin 开发了一套很棒的 ASP.NET Web Forms 4 课程。

你可以从 http://asp.net/web-forms 页面免费观看这个系列的课程(在左边的 Essential Videos 部分)。

下面是 ASP.NET Web Forms 系列的九个部分:

  1. ASP.NET 简介 (64 分钟)
  2. ASP.NET Web Forms 特性 (111 分钟)
  3. 使用数据 (75 分钟)
  4. Entity Framework (47 分钟)
  5. 母版页 (24 分钟)
  6. JavaScript and Ajax (62 分钟)
  7. 安全(很快提供)
  8. 使用 ASP.NET 动态数据 (很快提供)
  9. Web 发布 (很快提供)

即将提供更多内容

关注 http://asp.net/web-formshttp://asp.net/mvc,在接下来的几个月中,培训中心将会发布更多的文字和视频培训内容。每个培训中心现在都提供了良好的内容结构,可以快速查找和学习 ASP.NET 是如何工作的,今后,我们将会不断的扩展和完善其中的内容。

希望这会有所帮助

Scott