[转载]Flash图片压缩后上传

mikel阅读(1409)

[转载]图片压缩后上传[Flash] – ZjFree-自由自在 – 博客园.

图片压缩后上传!Flash图片极速上传!提供参数控制!

需求

如果用户使用数码相机照的照片一般都会在很大!(2M~5M)
一般网站都会在用户上传照片后对照片进行适当压缩,以提高网页浏览时照片的加载速度。
如果可以在客户端对照片压缩后上传,可以节省带宽,并且也减轻服务器压力。会有很好的用户体验!以前实现这样的功能都需要借助上传组件!
其实使用Flash 10.0就可以实现照片压缩后上传。

原理

  • 首先使用Flash的上传功能让用户选择要上传的照片。
  • 加载选择照片的数据到Flash中。(此功能需要Flash10.0以上版本)
  • 将数据加载到Flash的image组件中。
  • 将image按照合适大小进行缩放。
  • 在对image的显示区域进行Flash截图存入Bitmap。
  • 将Bitmap转换为Jpg格式数据。
  • 使用post方式将Jpg数据发送到服务器端!

调用方法

01 <!DOCTYPE html>
02 <html>
03 <head>
04 <title>图片压缩上传</title>
05 <script type="text/JavaScript" src="swfobject.js"></script>
06 </head>
07 <body onload="showFlash();">
08
09 <div id="divFlash">
10 加载中...
11 </div>
12 <script type="text/JavaScript">
13 function showFlash() {
14 var params = {
15 serverUrl: "saveImage.aspx",
16 jsFunction: "flashReturn",
17 imgWidth:500,
18 imgHeight:500,
19 imgQuality:80,
20 btnText:'图 片'
21 }
22 swfobject.embedSWF("imgZipUpload.swf", "divFlash", "100", "30", "10.0.0", "expressInstall.swf", params);
23 }
24
25 function flashReturn(type, str) {
26 if(type == 'error')
27 {
28 alert(str);
29 }
30 else if (type == 'complete')
31 {
32 var img1 = document.getElementById('img1');
33 img1.style.display = "block";
34 img1.src = str;
35 }
36 }
37 </script>
38 <img id="img1" style="display:none;" />
39 </body>
40 </html>

Flash参数说明

参数 名称 是否必填 默认值 取值范围
serverUrl 服务器端响应地址 必填项
imgWidth 图片缩放宽度 选填 100 10-2000
imgHeight 图片缩放高度 选填 100 10-2000
imgQuality 图片质量 选填 80 1-100
jsFunction 回调JS函数 选填
btnText 上传按钮文字 选填 上 传

说明:

  • 用户上传照片会等比压缩在指定范围内。
  • 但当用户照片尺寸必需要缩放尺寸小时,不对用户照片进行缩放。
  • 上传时只支持上传jpg或bmp格式图片。因为png或gif如果是透明的在压缩后会变得不透明,所以不支持png或gif图片上传。
  • imgQuality 图片质量数值越大质量越高,但文件也会越大。
  • jsFunction 回调JS函数参数type,str  type 当为error时,str为错误信息 当为complete,str为服务器端返回值
  • Flash中的按钮必须用户手动点击后才会弹出选择文件框!

服务器端页面(ASP.NET)

  • Request.InputStream 压缩后的jpg文件流
  • Request.Headers[“fileName”] 用户图片名称
  • Request.Headers[“width”] 压缩后宽度
  • Request.Headers[“height”] 压缩后高度
  • Response.Write(“”); 上传成功返回数据

实例及源码下载:http://files.cnblogs.com/zjfree/imgZipUpload.rar

[转载]文件服务分布式方案一点想法续(代码实现)

mikel阅读(795)

[转载]文件服务分布式方案一点想法续(代码实现) – 莫文的博客 – 博客园.

上一篇文件服务分布式方案的想法《文件服务分布式方案一点想法》,想法比较简单,图也比较简单,其实要是说没有什么实质的效果,还是有点的,呵呵。

实现此模式比较复杂的地方服务管理,主要是涉及到服务的负载均衡管理,以及服务死掉之后如何进行处理。
服务管理流程:
服务注册流程
服务请求处理过程:
服务调用流程
代码实现:
服务注册实现代码(服务站点启用时则自动运行)
1 ///   2 /// 功能:当前站点为服务站点,连接服务管理站点 3 /// 执行过程: 4 /// (1)、组装加密url 5 /// (2)、发送请求,并取得返回结果 6 /// (3)、返回 7 /// 8 /// 9 ///   10 public bool ConnectToManager() 11 { 12 try 13 { 14 //组装Url 15 string siteRootUrl = UrlHelper.GetSiteRoot(); 16 string flag = "abcd";//服务站点标识,可以是加密后的串,给服务管理判断当前服务是否是正确的服务来源 17 string url = Config.Get("ManagerUrl") + "/Connect.ashx?ServiceUrl=" + HttpUtility.UrlEncode(siteRootUrl) + 18 "&flag=" + flag; 19 string ret = HttpUtility.HtmlDecode(HttpHelper.DoGetResponse(url)); 20 //返回结果是否正确 21 if (string.IsNullOrEmpty(ret)) 22 { 23 //LogHelper.Write("连接服务管理者失败"); 24 return false; 25 } 26 //返回的消息是否正确 27 if (ret.Contains("Hello World")) 28 return true; 29 return false; 30 31 } 32 catch (Exception e) 33 { 34 //LogHelper.Write("连接服务管理站点失败,错误原因为:" + e.Message + e.StackTrace); 35 return false; 36 } 37 }
服务管理站点处理注册请求:
1 public void ProcessRequest(HttpContext context) 2 { 3 context.Response.ContentType = "text/plain"; 4 if (context.Request["flag"] != "" && context.Request["ServiceUrl"] != null) 5 { 6 string flag = context.Request["flag"].Trim(); 7 //证明来源合法 8 if (flag.Equals("abcd")) 9 { 10 //添加一个新的服务到服务列表 11 Service service = new Service {ServiceUrl = context.Request["ServiceUrl"]}; 12 ServiceManager.AddService(service); 13 //返回信息告诉服务站点,该服务已经注册成功 14 context.Response.Write("Hello World"); 15 } 16 } 17 } 18
服务消费站点Web条用服务,不直接调用服务,调用服务管理,然后返回数据:
1 public partial class _Default : System.Web.UI.Page 2 { 3 public string stringFromService = string.Empty; 4 protected void Page_Load(object sender, EventArgs e) 5 { 6 //调用服务管理站点 7 stringFromService = HttpHelper.DoGetResponse(Config.Get("ManagerUrl") + "?resId=mowen"); 8 } 9 } 10
服务管理站点,根据resid寻找服务,调用服务返回数据:

1 public void ProcessRequest(HttpContext context) 2 { 3 //资源id 4 string resId = context.Request["resid"] ?? string.Empty; 5 //找到服务 6 Service service = ServiceManager.GetService(resId); 7 8 if (service == null) 9 { 10 context.Response.Write("当前服务管理站点没有服务。"); 11 return; 12 } 13 //获取响应 14 context.Response.Write(service.GetServiceResponse(context)); 15 } 16
服务处理:

1 public void ProcessRequest(HttpContext context) 2 { 3 context.Response.ContentType = "text/plain"; 4 //资源id 5 string resId = context.Request["resid"] ?? string.Empty; 6 // 7 //此处可以进行一些文件操作 8 //例如打开文件,取数据,然后缓存起来 9 // 10 context.Response.Write(resId + "的服务"); 11 }

好,咱们来看最后运行情况(运行步骤,启用服务管理站点->启用服务站点(此时服务去服务管理注册服务)->启用Web调用服务):
(1)、启用服务管理

(2)启动服务站点(启动时自动注册服务)

(3)、服务站点处理服务站点注册事件

(4)、注册服务成功


(5)、利用Web调用服务

(6)、服务调用结果

出于展示Demo的目的,工程还有很多地方可以优化,大家可以尝试一下,~_~。

DEMO下载: http://www.cnfounder.com/mw/FileSolution.rar

[转载]分享18个常用的网站性能测试工具

mikel阅读(2368)

[转载]分享18个常用的网站性能测试工具 – 梦想天空 – 博客园.

网站的加载速度是决定网站等级的重要因素,值得站长特别关注。原因很简单,没有人愿意为了打开一个网页而等老半天,换句话说,如果你的网站打开 速度很慢,将流失大量的访客,甚至出现多米诺效应的不良影响。在埋头深入代码中试图提高网站速度之前,先要确定导致网站访问速度缓慢的真正原因是什么。本 文收集了非常有用的WEB服务和工具,可以帮助你诊断和分析你的网站,让你更加全面的了解自己的网站性能。

preview 18 Website Speed and Performance Checking Tools

在线测试工具


测试网站所有对象的加载时间(HTML,images,JavaScript,CSS,嵌入式框架等)。 您还可以检查网站每个元素的加载速度并改善加载缓慢的项目。 在测试结果中,可以看到网站每个元素的加载时间报告,元素的大小和元素的总数量。

pingdom 18 Website Speed and Performance Checking Tools

GTmetrix

结合了最流行的Firefox性能组件YSlow的和谷歌网页速度测试工具。 Gtmetrix给你提供改进网站速度的建议,虽然YSlow的和谷歌网页的速度测试的建议是针对Firefox的,也可以适用于其他浏览器。

gtmetrix 18 Website Speed and Performance Checking Tools

Light Speed Now

测试你的网站的速度性能,并把测试报告发送给到你的邮箱。

lightspeednow 18 Website Speed and Performance Checking Tools

Load Impact

Loadimpact对于一个每天有成千上万的游客访问的大型网站来说是个非常重要的工具。 一个免费帐户允许你模拟50个用户访问的压力测试,还要更多的话你就必须升级高级账号。

loadimpact 18 Website Speed and Performance Checking Tools

Site-Perf

它模拟浏览器下载图片,CSS,JS和其他文件,在报告中你可以看到先加载网站的哪些页以及加载时间。 这是十分有用的性能报告,可以用来查找到提高你的网站的载入速度需要改善的元素。

site perf 18 Website Speed and Performance Checking Tools

WebWait

一些基准测试,测试你网站的连接速度。

webwait 18 Website Speed and Performance Checking Tools

Gomez Networks

实时的测试单个网页的性能。

gomeznetworks 18 Website Speed and Performance Checking Tools

OctaGate

允许你监视用户打开你网站中一个或多个网页的时间。

octagete 18 Website Speed and Performance Checking Tools

Webslug

可以让你把你的网站和竞争对手的网站的加载速度进行比较。

webslug 18 Website Speed and Performance Checking Tools

WebToolHub

让你以了解您的网页在不同的访问速度下是如何加载的。Webtoolhub你可以知道页面的大小的信息,以及在不同的连接速度下,网页中CSS,JavaScript和图片的加载时间,这些都是进行基本的网页速度测试所需要的。

webtoolhub 18 Website Speed and Performance Checking Tools

IWebTool

可以让你同一时间对比10个页面。 您还可以检查主页,目录页面的载入时间。

iwebtool 18 Website Speed and Performance Checking Tools

Searchmetrics

显示了指定网站的加载持续时间。 此值可用于显示网站加载了多久,是否需要换个ISP。

searchmetrics 18 Website Speed and Performance Checking Tools

BrowserMob

不需要写测试脚本就可以知道网站即时的性能数据。

browsermob 18 Website Speed and Performance Checking Tools

常用测试软件


Pylot

开源的测试工具,可以测试网站的性能和可扩展性。 它运行HTTP负载测试,这是有用的容量规划,基准,分析和系统调整。

pylot 18 Website Speed and Performance Checking Tools

Google Page Speed

谷歌网页速度测试是一个开源的Firefox / Firebug插件。 网站管理员和Web开发人员可以使用该工具来评估其网页的性能并获取有关如何改进它们的建议。

page speed 18 Website Speed and Performance Checking Tools

YSlow

YSlow用来分析网页性能,并在高性能网页规则基础上建议如何改善。

yslow 18 Website Speed and Performance Checking Tools

PageTest

Internet Explorer的插件,常用来显示浏览器加载内容时发出的请求并提供了该进页面性能的建议。

pagetest 18 Website Speed and Performance Checking Tools

Multi-Mechanize

是一个网站性能和负载测试的开源框架。 它允许你编写Python脚本来生成对一个网站或Web服务的负载。

multi mechanize 18 Website Speed and Performance Checking Tools

编译来源:推荐18个网站速度及性能检查工具
原文来自:Website Speed and Performance Checking Tools

[转载]Linq初体验 Linq2SQL示例(原创)

mikel阅读(1144)

[转载]2.Linq初体验 Linq2SQL示例(原创) – 批发の上帝ぐ – 博客园.

Linq2SQL只是Linq中的一个很小的功能部分,我们今天就来看看用Linq如何对数据库进行增删查改的操作.

我的测试环境是:WIN7 + VS2008 + SQL2005

要想实现用Linq对数据库进行操作,我们要做的事情有如下几个:

1.      创建数据库,表和测试数据

2.      创建Linq To SQL类,配置类和数据库中的表的映射关系

3.      使用Linq的API函数对数据库进行操作

1.      创建数据库,表和测试数据

数据库:

User表:

测试数据:

SQL创建语句:

代码

USE [master] GO Create DataBase [LinQTest] GO USE [LinQTest] GO CREATE TABLE [dbo].[User]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO [User] ([Name]) VALUES ('zhang san') INSERT INTO [User] ([Name]) VALUES ('li si') INSERT INTO [User] ([Name]) VALUES ('wang wu') INSERT INTO [User] ([Name]) VALUES ('zhang lu') INSERT INTO [User] ([Name]) VALUES ('lao liang') INSERT INTO [User] ([Name]) VALUES ('lao san')

2.      创建Linq To SQL类,配置类和数据库中的表的映射关系

1.      新建一个Linq To SQL类:

2.      点击”服务器资源管理器”,然后在”数据连接”中添加我们刚刚创建好的LinQTest数据库为数据源

3.      将User表拖拽至Linq2SQL设计器中,VS会自动实现User表到User类的映射

4.      VS自动生成的User类的有关信息都在Linq2SQL.designer.cs中,大家可以打开这个文件好好看看里面都是什么内容

3.      好了,数据库准备完毕,映射也做好了,接下来就是看如何使用Linq来操作数据库了.我们就从查询开始吧,回到Main函数中,我们输入如下代码:

代码

//----------------------------------------------------------- // All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd . //----------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Linq2SQL体验 { /// <summary> /// Program /// /// 修改纪录 /// /// 2010.12.25 版本:1.0 黄聪 创建。 /// /// 版本:1.0 /// /// <author> /// <name>黄聪</name> /// <date>2010.12.25</date> /// </author> /// </summary> class Program { static void Main(string[] args) { //Linq To SQL 体验 Linq2SQLDataContext linq = new Linq2SQLDataContext(); //查询所有的User var users = linq.User.Select(u => u); foreach (var user in users) { Console.WriteLine(user.Name); } } } }

运行结果:

其中核心代码为:

var users = linq.User.Select(u => u);

如何?简单吧?一句SQL语句都不用写,连3层架构都不用搭建,就可以如此简单的对数据库进行查询了.

如果你想查询姓zhang的User,还可以这样写:

代码

//----------------------------------------------------------- // All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd . //----------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Linq2SQL体验 { /// <summary> /// Program /// /// 修改纪录 /// /// 2010.12.25 版本:1.0 黄聪 创建。 /// /// 版本:1.0 /// /// <author> /// <name>黄聪</name> /// <date>2010.12.25</date> /// </author> /// </summary> class Program { static void Main(string[] args) { //Linq To SQL 体验 Linq2SQLDataContext linq = new Linq2SQLDataContext(); //查询所有的User //var users = linq.User.Select(u => u); //查询姓zhang的User var users = linq.User.Select(u => u).Where(u => u.Name.StartsWith("zhang")); foreach (var user in users) { Console.WriteLine(user.Name); } } } }

运行结果:

其中核心代码为:

var users = linq.User.Select(u => u).Where(u => u.Name.StartsWith("zhang"));

哈哈,是不是也很简单呀?

下面继续讲如何使用Linq进行Insert,在Main中输入如下代码:

代码

//----------------------------------------------------------- // All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd . //----------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Linq2SQL体验 { /// <summary> /// Program /// /// 修改纪录 /// /// 2010.12.25 版本:1.0 黄聪 创建。 /// /// 版本:1.0 /// /// <author> /// <name>黄聪</name> /// <date>2010.12.25</date> /// </author> /// </summary> class Program { static void Main(string[] args) { //Linq To SQL 体验 Linq2SQLDataContext linq = new Linq2SQLDataContext(); //插入一个Name为黄聪的用户 User newUser = new User(); newUser.Name = "黄聪"; //使用Linq插入该用户到数据库中 linq.User.InsertOnSubmit(newUser); linq.SubmitChanges(); //查询所有的User var users = linq.User.Select(u => u); foreach (var user in users) { Console.WriteLine(user.Name); } } } }

运行结果:

其中核心代码为:

//插入一个Name为黄聪的用户 User newUser = new User(); newUser.Name = "黄聪"; //使用Linq插入该用户到数据库中 linq.User.InsertOnSubmit(newUser); linq.SubmitChanges();

我们继续看如何使用Linq来更新数据:

代码

//----------------------------------------------------------- // All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd . //----------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Linq2SQL体验 { /// <summary> /// Program /// /// 修改纪录 /// /// 2010.12.25 版本:1.0 黄聪 创建。 /// /// 版本:1.0 /// /// <author> /// <name>黄聪</name> /// <date>2010.12.25</date> /// </author> /// </summary> class Program { static void Main(string[] args) { //Linq To SQL 体验 Linq2SQLDataContext linq = new Linq2SQLDataContext(); //查找出要修改的User User newUser = linq.User.Single(u => u.Id == 1); newUser.Name = "Huang Cong"; //更新至数据库中 linq.SubmitChanges(); //查询所有的User var users = linq.User.Select(u => u); foreach (var user in users) { Console.WriteLine(user.Name); } } } }

运行结果:

其中核心代码为:

//查找出要修改的User User newUser = linq.User.Single(u => u.Id == 1); newUser.Name = "Huang Cong"; //更新至数据库中 linq.SubmitChanges();

最后我们来看看如何用Linq来进行数据的删除:

代码

//----------------------------------------------------------- // All Rights Reserved , Copyright (C) 2010 ,黄聪 , Ltd . //----------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Linq2SQL体验 { /// <summary> /// Program /// /// 修改纪录 /// /// 2010.12.25 版本:1.0 黄聪 创建。 /// /// 版本:1.0 /// /// <author> /// <name>黄聪</name> /// <date>2010.12.25</date> /// </author> /// </summary> class Program { static void Main(string[] args) { //Linq To SQL 体验 Linq2SQLDataContext linq = new Linq2SQLDataContext(); //查找出要删除的User User delUser = linq.User.Single(u => u.Id == 1); linq.User.DeleteOnSubmit(delUser); //更新至数据库中 linq.SubmitChanges(); //查询所有的User var users = linq.User.Select(u => u); foreach (var user in users) { Console.WriteLine(user.Name); } } } }

运行结果:

其中核心代码为:

//查找出要删除的User User delUser = linq.User.Single(u => u.Id == 1); linq.User.DeleteOnSubmit(delUser); //更新至数据库中 linq.SubmitChanges();

好了,以上就是我们使用Linq对数据库进行增删改查的示例,很简单,

但是Linq的功能绝对不止这么一些,我会在接下来的文章中和大家一起学习的.

再次声明:

本人也是刚刚开始学习Linq,本文仅提供给与我一样的初学者作为参考,

高手们请不要喷饭哈,如果有错误的地方还请各位见谅~~

[转载]ASP.NET MVC中的扩展点(三)控制器工厂

mikel阅读(1004)

[转载]MVC中的扩展点(三)控制器工厂 – xfrog – 博客园.

当路由系统找到与当前请求匹配的路由信息(RouteData),而路由信息中的RouteHandler为MvcRouteHandler,那么此请求 将由MvcRouteHandler返回的MvcHandler来负责处理。默认情况下MvcHandler将根据请求上下文 (RequestContext)中的信息找到对应的控制器和活动方法,通过调用活动方法,返回应答内容,将其返回给客户端。

MvcHandler类通过使用单例类ControllerBuilder的GetControllerFactory方法获取当前指定的 IControllerFactory对象,通过此对象来生成具体的IController控制器。对于MvcHandler来说,它只关心 IController对象,即只负责调用IController的Execute方法来产生应答内容。Action方法是MVC框架默认 Controller类中实现的一种机制,它通过路由信息中的action参数来确定调用Controller类中的某个对应方法,以此产生应答内容。

默认情况下,MVC框架使用DefaultControllerFactory控制器工厂,它使用路由信息中的controller参数来确定具体的控制器类,并通过反射机制生成控制器实例。

从MvcRouteHandler接收到请求到最终确定使用那个控制器,涉及到的类,如下图所示:

Controller

通过ControllerBuilder的SetControllerFactory方法我们可以指定自定义的控制器工厂,自定义工厂可以直接实现 IControllerFactory接口,也可以从DefaultControllerFactory类继承,如果直接实现 IControllerFactory,则我们必须自己实现一种机制将路由信息与控制器对应起来。所以为了使用MVC中默认的路由解析功能,我们通常从 DefaultControllerFactory继承,然后根据实际情况覆写GetControllerInstance与 GetControllerType方法,其中GetControllerInstance用于返回一个IController控制 器,GetControllerType用于根据路由信息获取合适的控制器类型。显然,在默认控制器工厂中,CreateController方法先调用 GetControllerType找出类型,然后调用GetControllerInstance方法创建一个控制器实例。

DefaultControllerFactory使用Activator.CreateInstance方法来创建控制器对象,所以MVC默认的控制器必须具有无参构造函数。下面我们使用依赖注入(DI)技术使我们的自定义控制器工厂具有实例化有参控制器。

设想以下情景:领域模型中有个Product类,我们为其定义了一个IProductsRepository的存储管理类。首先,我们实现了一个 SQLProductsRepository类,用于从SQLServer数据库中获取产品资料,然后,为方便测试,我们还实现了一个 MockProductsRepository类,用于返回一个简单的产品列表。我们建立一个ProductsController控制器,为确定使用哪 种存储实现,我们要求在生成控制器实例时,必须传入一个IProductsRepository对象:

mvc2

我们选用NInject开源库来实现DI(下载地址:http://ninject.org/download):

1、下载NInject,并解压

2、新建一个空的MVC工程

3、添加引用Ninject.dll、System.Data.Linq

4、在SQL Server Management Studio Express中附加上源代码中的Test数据库

5、按上述类图实现各个接口及类

6、创建一个ProductsController,增加一个带IProductsRepository参数的构造函数

显示行号 复制代码 ProductsController
  1. using System;
    
  2. using System.Collections.Generic;
    
  3. using System.Linq;
    
  4. using System.Web;
    
  5. using System.Web.Mvc;
    
  6. namespace CnBlogs.ControllerFactory.Controllers
    
  7. {
    
  8.     public class ProductsController : Controller
    
  9.     {
    
  10.         private IProductsRepository _repository;
    
  11.         public ProductsController(IProductsRepository repository)
    
  12.         {
    
  13.             _repository = repository;
    
  14.         }
    
  15.         public ActionResult Index()
    
  16.         {
    
  17.             return View(_repository.GetProductsList());
    
  18.         }
    
  19.     }
    
  20. }
    

.src_container { background-color: rgb(231, 229, 220); width: 99%; overflow: hidden; margin: 12px 0pt ! important; padding: 0px 3px 3px 0px; }.src_container .titlebar { background-color: rgb(212, 223, 255); border-width: 1px 1px 0pt; border-style: solid solid none; border-color: rgb(79, 129, 189) rgb(79, 129, 189) -moz-use-text-color; padding: 3px 24px; margin: 0pt; width: auto; line-height: 120%; overflow: hidden; text-align: left; font-size: 12px; }.src_container .toolbar { display: inline; font-weight: normal; font-size: 100%; float: right; color: rgb(0, 0, 255); text-align: left; overflow: hidden; }.toolbar span.button { display: inline; font-weight: normal; font-size: 100%; color: rgb(0, 0, 255); text-align: left; overflow: hidden; cursor: pointer; }.src_container div.clientarea { background-color: white; border: 1px solid rgb(79, 129, 189); margin: 0pt; width: auto ! important; height: auto; overflow: auto; text-align: left; font-size: 12px; font-family: “Courier New”,”Consolas”,”Fixedsys”,courier,monospace,serif; }.src_container ol.mainarea { padding: 0pt 0pt 0pt 52px; margin: 0pt; background-color: rgb(247, 247, 255) ! important; }.number_show { padding-left: 52px ! important; list-style: decimal outside none ! important; }.number_show li { list-style: decimal outside none ! important; border-left: 1px dotted rgb(79, 129, 189); }.number_hide { padding-left: 0px ! important; list-style-type: none ! important; }.number_hide li { list-style-type: none ! important; border-left: 0px none; }ol.mainarea li { display: list-item ! important; font-size: 12px ! important; margin: 0pt ! important; line-height: 18px ! important; padding: 0pt 0pt 0pt 0px ! important; background-color: rgb(247, 247, 255) ! important; color: rgb(79, 129, 189); }ol.mainarea li pre { color: black; line-height: 18px; padding: 0pt 0pt 0pt 12px ! important; margin: 0em; background-color: rgb(255, 255, 255) ! important; }.linewrap ol.mainarea li pre { white-space: pre-wrap; word-wrap: break-word; }ol.mainarea li pre.alt { background-color: rgb(247, 247, 255) ! important; }7、创建与Index Action方法对应的视图Index.aspx

8、创建一个控制器工厂: NinjectControllerFactory

显示行号 复制代码 NinjectControllerFactory
  1. using System;
    
  2. using System.Collections.Generic;
    
  3. using System.Linq;
    
  4. using System.Web;
    
  5. using System.Web.Mvc;
    
  6. using Ninject.Modules;
    
  7. using Ninject;
    
  8. using CnBlogs.ControllerFactory.Models;
    
  9. using System.Configuration;
    
  10. namespace CnBlogs.ControllerFactory.Infrastructure
    
  11. {
    
  12.     public class NinjectControllerFactory : DefaultControllerFactory
    
  13.     {
    
  14.         private IKernel _kernel = new StandardKernel(new MyModule());
    
  15.         protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    
  16.         {
    
  17.             if (controllerType == null)
    
  18.                 return null;
    
  19.             return (IController)_kernel.Get(controllerType);
    
  20.         }
    
  21.         private class MyModule : NinjectModule
    
  22.         {
    
  23.             public override void Load()
    
  24.             {
    
  25.                 //Bind<IProductsRepository>()
    
  26.                 //    .To<MockProductsRepository>();
    
  27.                 Bind<IProductsRepository>()
    
  28.                     .To<SqlProductsRepository>()
    
  29.                     .WithConstructorArgument("connectstring", ConfigurationManager.ConnectionStrings["TestDb"].ConnectionString);
    
  30.             }
    
  31.         }
    
  32.     }
    
  33. }
    

.src_container { background-color: rgb(231, 229, 220); width: 99%; overflow: hidden; margin: 12px 0pt ! important; padding: 0px 3px 3px 0px; }.src_container .titlebar { background-color: rgb(212, 223, 255); border-width: 1px 1px 0pt; border-style: solid solid none; border-color: rgb(79, 129, 189) rgb(79, 129, 189) -moz-use-text-color; padding: 3px 24px; margin: 0pt; width: auto; line-height: 120%; overflow: hidden; text-align: left; font-size: 12px; }.src_container .toolbar { display: inline; font-weight: normal; font-size: 100%; float: right; color: rgb(0, 0, 255); text-align: left; overflow: hidden; }.toolbar span.button { display: inline; font-weight: normal; font-size: 100%; color: rgb(0, 0, 255); text-align: left; overflow: hidden; cursor: pointer; }.src_container div.clientarea { background-color: white; border: 1px solid rgb(79, 129, 189); margin: 0pt; width: auto ! important; height: auto; overflow: auto; text-align: left; font-size: 12px; font-family: “Courier New”,”Consolas”,”Fixedsys”,courier,monospace,serif; }.src_container ol.mainarea { padding: 0pt 0pt 0pt 52px; margin: 0pt; background-color: rgb(247, 247, 255) ! important; }.number_show { padding-left: 52px ! important; list-style: decimal outside none ! important; }.number_show li { list-style: decimal outside none ! important; border-left: 1px dotted rgb(79, 129, 189); }.number_hide { padding-left: 0px ! important; list-style-type: none ! important; }.number_hide li { list-style-type: none ! important; border-left: 0px none; }ol.mainarea li { display: list-item ! important; font-size: 12px ! important; margin: 0pt ! important; line-height: 18px ! important; padding: 0pt 0pt 0pt 0px ! important; background-color: rgb(247, 247, 255) ! important; color: rgb(79, 129, 189); }ol.mainarea li pre { color: black; line-height: 18px; padding: 0pt 0pt 0pt 12px ! important; margin: 0em; background-color: rgb(255, 255, 255) ! important; }.linewrap ol.mainarea li pre { white-space: pre-wrap; word-wrap: break-word; }ol.mainarea li pre.alt { background-color: rgb(247, 247, 255) ! important; }9、在Global.asax.cs中设置自定义工厂

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);

    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}

.codearea { color: black; background-color: white; line-height: 18px; border: 1px solid rgb(79, 129, 189); margin: 0pt; width: auto ! important; overflow: auto; text-align: left; font-size: 12px; font-family: “Courier New”,”Consolas”,”Fixedsys”,”BitStream Vera Sans Mono”,courier,monospace,serif; }.codearea pre { color: black; line-height: 18px; padding: 0pt 0pt 0pt 12px ! important; margin: 0em; background-color: rgb(255, 255, 255) ! important; }.linewrap pre { white-space: pre-wrap; word-wrap: break-word; }.codearea pre.alt { background-color: rgb(247, 247, 255) ! important; }.codearea .lnum { color: rgb(79, 129, 189); line-height: 18px; }

Ok,要在虚拟产品列表与真实的SQLServer中的产品列表中切换,我们只需修改MyModule中的Load方法,将Controller构造函数中的特定参数绑定到一个具体的实现。

注意:本文涉及到有关的Linq、DI方面的知识,请参考相关资料。要运行本文示例,请先将源代码中的mdf文件附加到SQLServer Express中,并修改App.config中TestDb连接字符串的定义。

源代码下载

[转载]actionscript3.0 相对运动小案例

mikel阅读(1088)

[转载]actionscript3.0 相对运动小案例 – 火星人 – 博客园.

分析:

上例中按键向右的话,小球向右边移动,按键向左的话,小球向左移动,当快移动到背景图的两端时候,小球还在移动,直到靠边。

其实当小球移动到舞台的中央过后,再向右移动的时候,背景图就同时开始在向左移动,直到小球移动到快要到背景图的另外一端,背景图才不移动。 从舞台一端开始,你移动小球到了舞台正中央的时候,你应该感觉到小球始终在正中央,此时的背景在向小球移动相反的方向移动。

你 观看这个过程就像你观看一个人在扶手自动电梯上向电梯相反方向走步一样。电梯向上一台阶,人就向下一台阶。所以人始终还是在电梯原来那一阶,这个道理就和 小球为什么始终在舞台中央一样,但电梯一直在向上运动。如果把人比作小球,电梯比作背景,那么背景就一直在向上运动,就会感觉背景里的小球没运动。 当然你也可以理解为,小球向下运动,而背景没运动。这个就看你选择什么作为参照物了。

程序中,背景图宽800像素,小球和背景分别用了两个视图容器来处理这种相对移动。

小球类:

Ball.as

   1:  package com.helloshp.view
   2:  {
   3:      import flash.display.Sprite;
   4:  
   5:      public class Ball extends Sprite
   6:      {
   7:          public function Ball()
   8:          {
   9:              super();
  10:              init();
  11:          }
  12:  
  13:          private function init():void{
  14:              this.graphics.beginFill(0xff0000);
  15:              this.graphics.drawCircle(0,0,20);
  16:              this.graphics.endFill();
  17:          }
  18:      }
  19:  }
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas,”Courier New”,courier,monospace; background-color: rgb(255, 255, 255); }.csharpcode pre { margin: 0em; }.csharpcode .rem { color: rgb(0, 128, 0); }.csharpcode .kwrd { color: rgb(0, 0, 255); }.csharpcode .str { color: rgb(0, 96, 128); }.csharpcode .op { color: rgb(0, 0, 192); }.csharpcode .preproc { color: rgb(204, 102, 51); }.csharpcode .asp { background-color: rgb(255, 255, 0); }.csharpcode .html { color: rgb(128, 0, 0); }.csharpcode .attr { color: rgb(255, 0, 0); }.csharpcode .alt { background-color: rgb(244, 244, 244); width: 100%; margin: 0em; }.csharpcode .lnum { color: rgb(96, 96, 96); }背景类:

SceneView.as

   1:  package com.helloshp.view
   2:  {
   3:      import flash.display.Sprite;
   4:  
   5:      public class SceneView extends Sprite
   6:      {
   7:          [Embed(source="assets/bg.jpg")]
   8:          private var bg:Class;
   9:  
  10:          public function SceneView()
  11:          {
  12:              super();
  13:              init();
  14:          }
  15:  
  16:          private function init():void{
  17:              addChild( new bg() );
  18:          }
  19:      }
  20:  }

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas,”Courier New”,courier,monospace; background-color: rgb(255, 255, 255); }.csharpcode pre { margin: 0em; }.csharpcode .rem { color: rgb(0, 128, 0); }.csharpcode .kwrd { color: rgb(0, 0, 255); }.csharpcode .str { color: rgb(0, 96, 128); }.csharpcode .op { color: rgb(0, 0, 192); }.csharpcode .preproc { color: rgb(204, 102, 51); }.csharpcode .asp { background-color: rgb(255, 255, 0); }.csharpcode .html { color: rgb(128, 0, 0); }.csharpcode .attr { color: rgb(255, 0, 0); }.csharpcode .alt { background-color: rgb(244, 244, 244); width: 100%; margin: 0em; }.csharpcode .lnum { color: rgb(96, 96, 96); }主视图类:

MainView.as

   1:  package com.helloshp
   2:  {
   3:      import com.helloshp.view.Ball;
   4:      import com.helloshp.view.SceneView;
   5:  
   6:      import flash.display.Sprite;
   7:      import flash.events.Event;
   8:      import flash.events.KeyboardEvent;
   9:      import flash.ui.Keyboard;
  10:  
  11:      public class MainView extends Sprite
  12:      {
  13:          private var ball:Ball;
  14:          private var sv:SceneView;
  15:  
  16:          private var isStart:Boolean;
  17:          private var speed:int;
  18:          private const LIMIT_LEFT:int=0;    //背景图左边界
  19:          private const LIMIT_RIGHT:int=800;//背景图右边界
  20:  
  21:          public function MainView()
  22:          {
  23:              super();
  24:  
  25:  
  26:              if(stage!=null){
  27:                  init();
  28:              }
  29:              else{
  30:                  this.addEventListener(Event.ADDED_TO_STAGE,addedHandler)
  31:              }
  32:  
  33:          }
  34:  
  35:          private function init():void{
  36:              ball = new Ball();
  37:              sv = new SceneView();
  38:              addChild( sv );      //把背景试图放到舞台上
  39:              sv.addChild(ball);//把小球放到背景试图里面,而不是放到舞台上
  40:              ball.y = 200;
  41:  
  42:              stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
  43:              stage.addEventListener(KeyboardEvent.KEY_UP,kyUpHandler);
  44:              addEventListener(Event.ENTER_FRAME,enterFrameHandler);
  45:          }
  46:  
  47:          //键盘弹起就停止移动
  48:          private function kyUpHandler(e:KeyboardEvent):void{
  49:              isStart = false;
  50:          }
  51:  
  52:          //键盘按下就开始移动
  53:          private function keyDownHandler(e:KeyboardEvent):void{
  54:              switch( e.keyCode ){
  55:                  case Keyboard.RIGHT:
  56:                      isStart = true;
  57:                      speed = 10;
  58:                      break;
  59:                  case Keyboard.LEFT:
  60:                      isStart = true;
  61:                      speed = -10;
  62:                      break;
  63:                  default:
  64:                      speed = 0;
  65:                      break;
  66:              }
  67:          }
  68:  
  69:          private function enterFrameHandler(e:Event):void{
  70:              if( !isStart) return;
  71:  
  72:              ball.x += speed;//小球在X轴加速移动                     
  73:  
  74:  
  75:              if(ball.x < LIMIT_LEFT)//如果小球的X坐标小于背景视图的左边界,就让小球一直停止在视图的左边界的位置
  76:                  ball.x = LIMIT_LEFT;
  77:              else if( ball.x > LIMIT_RIGHT  )//如果小球的X坐标大于背景视图的右边界,就让小球一直停止在视图的右边界位置
  78:                  ball.x = LIMIT_RIGHT;
  79:  
  80:  
  81:              if( ball.x < stage.stageWidth/2 ){//如果小球X坐标运动小于舞台一半,就让场景视图停止在左边界
  82:                  sv.x = LIMIT_LEFT;
  83:              }
  84:              else if( ball.x > LIMIT_RIGHT - stage.stageWidth/2 ){//如果小球X坐标运动到 大于 背景视图右边界减去舞台宽度一半,就让背景视图右边界移动到舞台的右边界
  85:                  sv.x = -LIMIT_RIGHT + stage.stageWidth;
  86:              }
  87:              else{//当小球运动到舞台的一半的时候,背景视图 就在舞台上向小球相反的方向运动,
  88:                  sv.x = -(ball.x - stage.stageWidth/2);
  89:              }
  90:          }
  91:  
  92:          private function addedHandler(e:Event):void{
  93:              init();
  94:          }
  95:      }
  96:  }

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas,”Courier New”,courier,monospace; background-color: rgb(255, 255, 255); }.csharpcode pre { margin: 0em; }.csharpcode .rem { color: rgb(0, 128, 0); }.csharpcode .kwrd { color: rgb(0, 0, 255); }.csharpcode .str { color: rgb(0, 96, 128); }.csharpcode .op { color: rgb(0, 0, 192); }.csharpcode .preproc { color: rgb(204, 102, 51); }.csharpcode .asp { background-color: rgb(255, 255, 0); }.csharpcode .html { color: rgb(128, 0, 0); }.csharpcode .attr { color: rgb(255, 0, 0); }.csharpcode .alt { background-color: rgb(244, 244, 244); width: 100%; margin: 0em; }.csharpcode .lnum { color: rgb(96, 96, 96); }

源代码下载:http://files.cnblogs.com/bigbigdotnet/relativeMove.rar

[转载]Android GPS 定位的实现(2-1) 使用Google地图

mikel阅读(860)

[转载]Android GPS 定位的实现(2-1) 使用Google地图 – 彬彬的博客 – 博客园.

要在Android客户端显示Google地图,就要使用google 的API,这次使用的的不是Android 的SDK而是直接使得的Google的,因为没有细究,所以他们之间具体有多少区别,现在还不太清楚,等有时间了,再仔细看一看,显示地图使用的是 View为:com.google.Android.maps.MapView 但是要使用的话,还得去google 申请一个Map的Key去,具体怎么申请,这里不再细说,不过个人感觉如果是测试的话,随便找一个Key也是可以的没有感觉到什么不同,不知道发布的时候怎么样。

以面的做完之后,因为地图使用的是网络,因此必须得有网络的访问权限,这个需要添加上去。否则无法得到地图信息。

下面 就是实现代码:

首先定义地图的控制器:

private MapController mapController; private GeoPoint geoPoint; //这个表示的是定位中心点在代码中有实现

然后就可以实现了!

下面是实现代码:

代码

setContentView(R.layout.main); MapView mapView = (MapView)findViewById(R.id.mapview1); mapController = mapView.getController(); mapView.setEnabled(true); mapView.setClickable(true); mapView.setBuiltInZoomControls(true); geoPoint = new GeoPoint((int)40.9166666666667*1000000,(int)116.816666666667*1000000); mapController.animateTo(geoPoint); mapController.setZoom(12);

如果要在某点显示信息的话,可以通过下面的函数进行设置:

代码

当然要显示地图,如果我们继承的是Activity的话,是无法进行显示的,所以要改为MapActivity,这也就是为什么要使用google Api的原因了!

好了,这个地图,结合前面讲的GPS信息获取都已经实现了,再下面就可以实现通过GPS定位了,其实你只要把他们两个结合起来就能实现定位了!

[转载]图书站点检索界面设计分析

mikel阅读(1160)

[转载]图书站点检索界面设计分析 – 莫文的博客 – 博客园.

无论哪个系统在检索上都需要花费很大的力气设计的东西,让我们现在来看看现在国内有名的图书站点(当当卓越京东番薯)都是如何设计检索界面的。

首先来看检索条设计

检索相比导航来说,它的重要性是要低一些的(除了搜索引擎站点),因为使用检索的用户,一般目的都很明确,在系统的逗留时间相对来说也比较短而稳 定,但使用导航的用户就不一样,他们在寻找着自己喜欢的东西,只有通过导航找不着他要找的东西的时候才会使用检索系统,所以导航系统不能占页面的很多的地 方,但必须很明显,用户需要的时候,非常方便的找到。咱们来看以下站点设计:

当当:

卓越: 

京东图书:

番薯

当当和京东采用的是黄色的色调,而卓越和番薯用的是蓝色的色调。从色调来说,没什么可挑剔的,只要符合行业,符合自己的品牌文化即可,但有一点需要注意,就是无论什么色调都要内容清晰,保证用户看起来不费劲。

当当采用的是在黄色色调环境下,使用蓝色的检索框,非常的明显,用户非常容易找到,本身检索框设计很简单,就一个文本框加一个检索按钮,后边跟了一 个不是很明显的高级检索按钮以及热搜词。检索框跟检索按钮设计成了一体,很是干净且因为文本框的边框为蓝色,很是突出,无论是在头部,还是整个页面中,都 能一眼找到检索框。高级检索并不是多数人选择,所以它的重要性不能跟检索按钮比,在这种情况下,把它设计成链接,降低它的明显度很是合理。这里还有一个很 合理的地方,就是在检索框的左边放置了一个分类下拉链接,鼠标悬停的时候能看到所有分类。若用户在看分类,他能知道检索框在哪,用户在检索的时候,他也知 道分类导航就在手边,很方便切换。

卓越的检索相对当当的来说,复杂了一点,检索框是和头部一体的,左边是切换资源分类(默认为图书),检索按钮后边有两个比检索按钮更大的按钮“购物 车”、“心愿单”,相对来说,卓越网的检索不是很突出,还有一处不合理的地方就是,将高级按钮链接放到了检索条底下,脱离了检索框,按理说,一类的东西应 该放在一组里边,这样用户才能方便查找,现在这两样东西分开了,用户想高级检索的时候,在检索条上边却找不到了。和当当的检索框相比,它没有了热搜词。

京东的图书频道和当当的设计很类似,左边是分类,检索按钮是高级检索链接,但有点区别,首先检索条也是和头部是一体的,没有特意突出检索框和检索按钮,右边是购物车,但这里又卓越有差别,它的购物车放在了右边,和检索框有一定的距离,没有给检索造成视觉上的干扰。

番薯网在检索条的设计上和前边的站点差别比较大,它把检索嵌进头部中,成为头部飘着的一部分。不过仅仅是从检索条来说,和当当相比,更简洁,就一个 文本框和一个按钮。相比页面的其他内容来说,也是比较突出的,且检索条放在导航栏的上边,在导航中找不着自己想要的东西后,就可以直接使用检索条进行检 索。

2、检索提示设计:

当当:

卓越:

京东图书:

番薯

从检索提示来看,各个站点的特点都不一样,当当网很明显后边有检索词库支持,而卓越进行的是书名检索,京东出于比较尴尬的境地,没有一个建议是和书相关的,番薯干脆就不提供此功能。

3、检索结果显示界面设计

当当:

卓越:

京东图书:

番薯

从检索结果显示来看,这个四个网站差别还是蛮大的,唯一相同的一点就是这四个站点都对用户输入的关键词在检索之后显示了出来。

1、当当在检索结果页面提供了分类帅选、检索建议、资源类型切换(四个网站中只有当当提供)、快速排序切换、详细的元数据展示、单独用户操作行、关键词反显等功能。

2、卓越在检索结果页面提供分类帅选、排序方式、消费操作单独分组等功能。

3、京东图书的检索结果页面提供分类帅选、快速排序方式切换、用户操作单独一行、关键词反显、详细的元数据信息、推荐信息等功能。

4、番薯网的检索结果提供检索历史、关键词反显、用户操作单独一组等功能。

这里当当和京东做的比较好的一点是在排序方式切换上,很是方便,卓越将元数据都堆到标题中,有点不大合适。而番薯网没有提供分类帅选很是奇怪。

再看看这几个网站对于没有检索结果的界面展示:

当当:

卓越:

京东图书: 

番薯

这里,只有京东和番薯说了抱歉之外,其他两个网站不管用户感受,当当直接展示检索关键词分词之后的检索结果,卓越和京东展示了推荐信息,番薯就只提供了检索建议。

[转载]代码生成技术--CodeDom VS T4

mikel阅读(1237)

[转载]代码生成技术–CodeDom VS T4 – 破狼 – 博客园.

在微软的自家代码生成方案中我们有两种选择方式:CodeDom 和Text Template Transformation Toolkit(T4)模板。同样我们可以利用简单的String或者StringBuilder来拼接字符串,但是那对于简单的还可以,但是对于复杂的 问题就悲伤。其实在ASP.NET MVC 3.0中有多处了一个更简洁语法的模板-Razor,我们同样可以运用于我们自己的代码生成中,我随便有一篇简单的介绍Razor Templating Engine,在以后有机会了会写Razor Demo。今天的主题不在这里,所以不多说了。

一:简介:

CodeDom:这 个类库出现在我们的.NET Framework 2.0,并且被深深的用于我们的ASP.NET项目中。CodeDom关注于一个语言独立性,以至于我们可以利用我们熟悉的语言(C#,vb等)构建一个 CodeDom Model Tree,就可以生成我们在.NET平台所支持的语言代码。对于我们的ASP.NET要求语言的独立。

T4:T4模板作为VS2008的一部分出现,他以<# #> 、<#= #>接近于ASP.NET的语言在模板中插入一段段的动态代码块,可以像asp或者ASP.NET一样简单的更让人贴切,相对于CodeDom就更 简洁,但是没有了语言层次的抽象,不具有语言独立性,我们必须为同一个功能的模板在不同的语言上写不同的模板,但是在开发中往往C#模板就足够了,以及更 简单化所以得到了更多人的青睐。

二:Code Demo:

下面我们将用CodeDom和t4分别生成一个简单的Code,根据时间输出不同的问候,如下:

1:CodeDom Code:

代码

2:T4 Code:

代码

三:总结:

CodeDom的优势:

1:具有语言层次抽象,独立性:是一个单语言开发,多语言生成的方式。

2:Framework 的支持:作为我们的.NET Framework 一部分出现的,位于System.CodeDom命名空间下。不需要想T4 模板一样引用Microsoft.VisualStudio.TextTemplating.dll

T4优势:

1:更加贴切:采用的是类似于ASP、ASP.NET的语言块,是的我们的开发更贴切,采用模板方式更加简洁,快速。

2:可维护性:由于是基于文件,不像codedom编译成为dll方式,我们可以随时修改Template文件、重构。

其实我觉得只要是不要求语言独立性,多语言生成的话,就采用T4或者Razor等模板。

代码生成技术(目前完成,还在继续,好久没写了…):

1:CodeDom系列目录

2:CodeSmith模板引擎系列-目录

3:Razor Templating Engine

[转载]ASP.NET MVC3 Webgrid Ajax查询条件绑定(Search Conditions Binding)、自动编号(Serial Number)及分页(Paging)的样式定义

mikel阅读(961)

[转载][原创] MVC3 Webgrid Ajax查询条件绑定(Search Conditions Binding)、自动编号(Serial Number)及分页(Paging)的样式定义 – 大熊的空间 – 博客园.

[原创] MVC3 Webgrid Ajax查询条件绑定(Search Conditions Binding)、自动编号(Serial Number)及分页(Paging)的样式定义

本文只代表作者在一定阶段的认识与理解。

一.写作前提

在MVC3 Bate version的时候小试了一把Webgrid ,并写了篇记录文章《[原创] MVC3 Web.Helpers – WebGrid Ajax 及查询绑定》,这篇文章在对webgrid一定阶段认识的条件下完成的,本文将就一些功能再加入说明,并把自动 编号及Paging CSS的实现加以说明,同时也希望能给更多人带来方便。

二.本文内容

  1. JQuery Ajax实现Webgrid查询条件的绑定(Search Conditions Binding),并将Webgrid公用化
  2. Webgrid自动编号(serial number)的实现
  3. Webgrid paging style的定义

三.Webgrid Ajax查询条件绑定及Webgrid公用化

注:需要加载JQuery的Script的文件,具体请参考《[原创] MVC3 Web.Helpers – WebGrid Ajax 及查询绑定》。

实现查询条件和webgrid绑定其实是通过把查询条件以Routing 的形式来传递,使生成webgrid的sorting及paging的请求路径中同样包含首次生成webgrid时候的查询条件,从而使webgrid可 以保持查询条件的前提下做paging和sorting的操作,请看现面的例子。

Search Page

1 @{ 2 View.Title = "Index"; 3 Layout = "~/Views/Shared/_Layout.cshtml"; 4 } 5  <script> 6 $(function () { 7 $("#btnSearchStudent").click(function (e) { 8 e.preventDefault(); 9 var url = "?studentName=" + $("#StudentName").val() + 10 "&studentChineseName=" + $("#StudentChineseName").val(); 11 url = "@ViewData["AppPath"]/Home/SearchStudent/" + url; 12 $('#searchformDiv').load(url, function (html) 13 { $('#searchformDiv')[0].value = html; }); 14 }); 15 }); 16  </script> 17 Student Name: @Html.TextBox("StudentName") 18  <br /> 19 Student Chinese Name : @Html.TextBox("StudentChineseName") 20  <br /> 21  <input type="button" value="Search" id="btnSearchStudent" /> 22  <div id="searchformDiv"> 23  </div>

在上面的razor代码中,有两个查询条件Student Name和 Student Chinese Name,当我们点击Search Button的时,调用JQuery的Ajax Request方法,并把结果返回到指定的Div标签中。小提一下,本来也像很多一样疯狂的喜爱razor的coding方式,使得代码相当简单。下面是 Action的实现代码。

Controller

1 namespace TOM.Custom.Controllers 2 { 3 [HandleErrors] 4 public class HomeController : BaseController 5 { 6 private IStudent _s; 7 8 public HomeController() 9 { 10 this._s = PolicyFactory.Create(); 11 } 12 13 public ActionResult Index() 14 { 15 this.ViewData.Model = this._s.SearchStudent(string.Empty, string.Empty); 16 return View("SearchStudent"); 17 } 18 19 public PartialViewResult SearchStudent(string studentName, string studentChineseName) 20 { 21 IDictionary showColumns = new Dictionary(); 22 23 this.ViewData.Model = this._s.SearchStudent(studentName, studentChineseName); 24 25 showColumns.Add("Student ID", "StudentID"); 26 showColumns.Add("Student Name", "StudentName"); 27 showColumns.Add("Student Code", "StudentCode"); 28 showColumns.Add("Sex", "Sex"); 29 showColumns.Add("NRIC/Passport No.", "NRICPassport"); 30 31 this.ViewModel.ShowColumns = showColumns; 32 return PartialView("UC/WebgridTemplate", this.ViewData.Model); 33 } 34 } 35 }

Action中,根据UI传递的参数进行查询,并返回一个PartialViewResult,然后把这个PartialView返回给 UI的div。在我的例子中这个PartialView返回的就是一个经过定制化的webgrid, 在上面的Action中,我们把查询结果以Model的形式返回,并且用变量“showColumns”列出了要显示的列名称及 绑定的字段,所以我们的webgrid现在只要显示指定结果中的指定字段即可。换言之,如果其它action中也有一个查询结果,并指定绑定,那么他就可 以使用这个webgrid的PartialView。OK,我们来看看这个PartialView如何实现webgrid的公用化。

PartialView Webgrid

1 @{ 2 var grid = new WebGrid(source: Model, canPage: true, 3 canSort: true, ajaxUpdateContainerId: "DivGridd", rowsPerPage: 20); 4 5 IList webGridcolumns = new List(); 6 IDictionary showColumns = ViewData["ShowColumns"] as IDictionary; 7 8 if (showColumns.Count &gt; 0) 9 { 10 foreach (string col in showColumns.Keys) 11 { 12 webGridcolumns.Add(grid.Column(showColumns[col], col)); 13 } 14 } 15  <div id="DivGridd"> 16  <div class="content-box"> @grid.GetHtml( 17 caption: "Search Result:", 18 mode: WebGridPagerModes.All, 19 numericLinksCount: 10, 20 fillEmptyRows: true, 21 emptyRowCellValue: " ", 22 columns: webGridcolumns 23 ) 24 <div class="webgrid-totalRow"> Total Result: @grid.TotalRowCount</div> 25 </div> 26 </div> 27 }

查询结果图

下面是webgrid生成的jQuery ajax paging 代码,我们可以看到,它会把查询条件以Routing的形式进行传递,从而保证可以在查询结果中进行paging.

代码图

四.Webgrid自动编号

在传统的gridview中可以很方便的进行自动 编号,但是似乎webgrid并没有给我们直接实现这个功能,那我们只能通过变通的方法来实现了。在生成Webgrid的column时,它提供了一个 format的方法,允许我们定制、填充这个column,在本例中,就是通过page size乘page number作为编号的开始,每一行加1,这样我们就可以实现自动编号了,我们修改上面的PartialView如下所示。

PartialView Webgrid

1@{ 2 var grid = new WebGrid(source: Model, canPage: true, 3 canSort: true, ajaxUpdateContainerId: "DivGridd", rowsPerPage: 20); 4 var i = grid.RowsPerPage * grid.PageIndex; 5 6 IList webGridcolumns = new List(); 7 IDictionary showColumns = ViewData["ShowColumns"] as IDictionary; 8 9 webGridcolumns.Add(grid.Column(format: (item) =&gt; (++i).ToString(), header: "S/N")); 10 11 if (showColumns.Count &gt; 0) 12 { 13 foreach (string col in showColumns.Keys) 14 { 15 webGridcolumns.Add(grid.Column(showColumns[col], col)); 16 } 17 } 18 19@grid.GetHtml( 20<div id="DivGridd"> 21<div class="content-box"> caption: "Search Result:", 22 mode: WebGridPagerModes.All, 23 firstText: "« First", 24 previousText: "« Previous", 25 nextText: "Next »", 26 lastText: "Last »", 27 numericLinksCount: 10, 28 fillEmptyRows: true, 29 emptyRowCellValue: " ", 30 columns: webGridcolumns 31 ) 32<div class="webgrid-totalRow"> Total Result: @grid.TotalRowCount</div> 33</div> 34</div> 35}

在上面的代码中var i = grid.RowsPerPage * grid.PageIndex;每行显示行数乘页数=当前页行号开始
webGridcolumns.Add(grid.Column(format: (item) => (++i).ToString(), header: “S/N”));
在创建每一行的时候,webgrid会以++i的值作为S/N列显示的值

五.Paging Style的定义

上面的Style相信大家看了都不太喜欢吧,好吧,那我们就来修改修改。我们在partralview的GetHtml的方法中,加了下面三个属性:

tableStyle: “webgrid-table”,

headerStyle: “webgrid-header”,

footerStyle: “paging-number”,

实现如下效果:

分页图

CSS如下:

CSS

1.webgrid-table 2{ 3 width: 100%; 4 height: 100%; 5 padding: 5px 5px 5px 5px; 6} 7 8.webgrid-table caption 9{ 10 text-align: left; 11 vertical-align: middle; 12 padding: 0px 0px 0px 5px; 13 font-size: medium; 14 font-weight: bold; 15} 16 17.webgrid-header 18{ 19 text-align: left; 20 vertical-align: middle; 21} 22 23.webgrid-totalRow 24{ 25 font-weight: bold; 26} 27 28.paging-number 29{ 30 text-align: left; 31 padding: 20px 0 5px 0; 32 font-family: Verdana, Arial, Helvetica, sans-serif; 33 font-size: 10px; 34 border-width: 1px; 35} 36 37.paging-number a 38{ 39 margin: 0 5px 0 0; 40 padding: 3px 6px; 41 border: 1px solid #ddd; 42 -moz-border-radius: 5px; 43 -khtml-border-radius: 5px; 44 -webkit-border-radius: 5px; 45 border-radius: 5px; 46}

六.总结
通过本章的学习,可以了解如下内容:

1.MVC3 中Webgrid Ajax Paging的操作

2.Webgrid中属性的使用

3.Webgrid中Paging Style的设置