[转载]自定义asp.net mvc的WebFormViewEngine修改默认的目录结构 - liulun - 博客园

mikel阅读(959)

[转载]【小技巧】自定义asp.net mvc的WebFormViewEngine修改默认的目录结构 – liulun – 博客园.

先看一下我的解决方案的目录结构吧~~~

一:先把Controller程序提取出来

默认的情况是所有的****Controller.cs文件都会放在Web程序集下的一个叫Controllers的文件夹下

这样感觉有点不爽(你懂的…)

我们决定把所有的Controller程序放到一个自定义的应用程序集中去(上图中的mrlh.Admin.Controllers)

先把web程序集下的Global.asax.cs文件删掉

然后把Global.asax的标记代码改为如下:

<%@ Application Codebehind="mrlh.Admin.Controllers.App.MvcApplication" Inherits="mrlh.Admin.Controllers.App.MvcApplication" Language="C#" %>

这样应用程序启动时就会到我们自定义的应用程序集去执行相关的操作了

mrlh.Admin.Controllers.App.MvcApplication的相关代码如下

namespace mrlh.Admin.Controllers.App
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "XiTong", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );
        }
        protected void Application_Start()
        {
            //以下两句为启用自定义的WebFormViewEngine
            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new MvcViewEngine());
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);
           
        }
    }
}

这样做之后

所有的Controller程序就不用集中写到web程序集中去了,

就可以写在mrlh.Admin.Controllers这个程序集中了

 

二:改变View文件夹的目录结构

默认的情况是所有的****.aspx文件都放在web程序集中的Views目录下

这样感觉也有点不爽(你懂的…)

如果想改变aspx文件的目录结构,就必须自定义WebFormViewEngine了

细心的读者会看到在上面的代码中Application_Start方法里前面三句话

//以下两句为启用自定义的WebFormViewEngine
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new MvcViewEngine());

这就是把自定义的 WebFormViewEngine添加到应用程序中去的方法

MvcViewEngine的代码如下

namespace mrlh.Admin.Controllers.App
{
    public class MvcViewEngine : VirtualPathProviderViewEngine
    {
        public MvcViewEngine()
        {
            MasterLocationFormats = new[] {
                "~/{1}View/{0}.master",
                "~/SharedView/{0}.master"
            };
            AreaMasterLocationFormats = new[] {
                "~/Areas/{2}/Views/{1}/{0}.master",
                "~/Areas/{2}/Views/Shared/{0}.master",
            };
            ViewLocationFormats = new[] {
                "~/{1}View/{0}.aspx",
                "~/{1}View/{0}.ascx",
                "~/SharedView/{0}.aspx",
                "~/SharedView/{0}.ascx"
            };
            AreaViewLocationFormats = new[] {
                "~/Areas/{2}/Views/{1}/{0}.aspx",
                "~/Areas/{2}/Views/{1}/{0}.ascx",
                "~/Areas/{2}/Views/Shared/{0}.aspx",
                "~/Areas/{2}/Views/Shared/{0}.ascx",
            };
            PartialViewLocationFormats = ViewLocationFormats;
            AreaPartialViewLocationFormats = AreaViewLocationFormats;
        }
        protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
        {
            return new WebFormView(partialPath, null);
        }
        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
            return new WebFormView(viewPath, masterPath);
        }
    }
}

这样做之后类似这样的请求

http://localhost:12232/YuanGong/YuanGong

都会在web程序集中找到YuanGongView/YuanGong.aspx

然后再呈现给“观众”

注意:

这里不能试图把每个文件夹名字中后面的”View”字样去掉,

因为ASP.NET MVC如果发现服务器的物理路径上存在相应的文件,将直接输出了

也就是请求是这样的http://localhost:12232/YuanGong/YuanGong

发现服务web目录下对应有此文件YuanGong/YuanGong.aspx

将直接输出

三:自定义目录结构的好处

我之所以这样做一个是为了感官上的舒服,毕竟自己的程序跟自己的媳妇一样

不但要从触觉上考虑,还要从视觉上考虑

另外还可以把多个web程序集的controller程序放在同一个程序集中方便代码的重用

(忽然觉得好像面向服务编程)

其三目录结构改变了,也方便权限的控制

 

 

demo:http://files.cnblogs.com/liulun/MRLH.rar

[转载]园友们赶快行动起来,免费获得微软MCSD证书! - 圣殿骑士 - 博客园

mikel阅读(833)

[转载]园友们赶快行动起来,免费获得微软MCSD证书! – 圣殿骑士 – 博客园.

免费获得微软HTML5,JavaScript和CSS3的MCSD证书(价值一千多大洋)。如果你对此感兴趣,下面就和圣殿骑士一起完成注册和考试预定。

PS.今天新加坡过节,不上班,有什么问题,圣殿骑士会尽力解答)。

另外,经很多园友建议,如果有注册成功的朋友,回复可以加上城市信息(哪个城市注册成功),这样可以方便其他其他园友得到更有用的信息——更新于2012-11-13 12:25

首先在浏览器输入:http://www.microsoft.com/learning/en/us/offers/html5.aspx  ,进入如下页面:

image

点击如图“free online course” 进入视频学习页面,在此页面你可以学习到怎样用HTML5,JavaScript和CSS3进行编程。

image

在线是用的Silverlight进行播放,如果你想下载该视频,也可以通过右边的链接选择不同清晰度版本进行下载。

image

点击第一幅图中的(Exam 70-480)链接,我们进入考试信息页面:

image

然后点击Schedule进入考试预定以及个人信息设置页面:

image

点击上图Login链接进行登录,如果没有账号,可以在里面进行注册操作。

image

然后点击Create a new account链接注册一个新的账号:

image

注册完成之后,点击Schedule an Exam链接进行考试预定操作,如下图所示:

image

点击Next进入下一页:

image

选择考试的科目:Programming in HTML5 with JavaScript and CSS3

image

然后选择你要考试的地点进行预定(因为目前圣殿骑士在新加坡,所以会出现新加坡的所有考点,在国内的朋友,会显示国内城市考点信息):

image

点击Enter Promo Code/Voucher按钮,然后输入“HTMLJMP”作为Promo Code(这一步很关键,屌丝福利

image

预定完成之后会出现如下页面:

image

以上就是相关的整个操作,你也会收到确认邮件。接下来就需要学习视频及准备考试,预祝广大园友们都能通过!:-D

BTW: 圣殿骑士把考试预定到了12月30日,如果有志同道合的童鞋,可以一起学习讨论,虽然不是很喜欢用微博,总觉得有些浪费时间,但也贴出来以便和大家交流:http://www.weibo.com/knightswarrior

如果你觉得此信息能给你或其他园友带来福利的话,请按“推荐”按钮,以便让更多的人受益,毕竟广大程序员同志们都不容易,能节约一千多大洋且免费拿证书,何乐而不为呢!正所谓“送人玫瑰,手有余香”,谢谢!

[转载]判断移动客户端设备 - alronzhang - 博客园

mikel阅读(1415)

[转载]判断客户端设备 – alronzhang – 博客园.


public static bool isMobileBrowser()
{
//GETS THE CURRENT USER CONTEXT
HttpContext context = HttpContext.Current;

//FIRST TRY BUILT IN ASP.NT CHECK
if (context.Request.Browser.IsMobileDevice)
{
return true;
}
//THEN TRY CHECKING FOR THE HTTP_X_WAP_PROFILE HEADER
if (context.Request.ServerVariables["HTTP_X_WAP_PROFILE"] != null)
{
return true;
}
//THEN TRY CHECKING THAT HTTP_ACCEPT EXISTS AND CONTAINS WAP
if (context.Request.ServerVariables["HTTP_ACCEPT"] != null &amp;&amp;
context.Request.ServerVariables["HTTP_ACCEPT"].ToLower().Contains("wap"))
{
return true;
}
//AND FINALLY CHECK THE HTTP_USER_AGENT
//HEADER VARIABLE FOR ANY ONE OF THE FOLLOWING
if (context.Request.ServerVariables["HTTP_USER_AGENT"] != null)
{
//Create a list of all mobile types
string[] mobiles =
new[]
{
"midp", "j2me", "avant", "docomo",
"novarra", "palmos", "palmsource",
"240x320", "opwv", "chtml",
"pda", "windows ce", "mmp/",
"blackberry", "mib/", "symbian",
"wireless", "nokia", "hand", "mobi",
"phone", "cdm", "up.b", "audio",
"SIE-", "SEC-", "samsung", "HTC",
"mot-", "mitsu", "sagem", "sony"
, "alcatel", "lg", "eric", "vx",
"NEC", "philips", "mmm", "xx",
"panasonic", "sharp", "wap", "sch",
"rover", "pocket", "benq", "java",
"pt", "pg", "vox", "amoi",
"bird", "compal", "kg", "voda",
"sany", "kdd", "dbt", "sendo",
"sgh", "gradi", "jb", "dddi",
"moto", "iphone"
};

//Loop through each item in the list created above
//and check if the header contains that text
foreach (string s in mobiles)
{
if (context.Request.ServerVariables["HTTP_USER_AGENT"].
ToLower().Contains(s.ToLower()))
{
return true;
}
}
}

return false;
}

来源:http://www.codeproject.com/KB/aspnet/mobiledetect.aspx

 

[转载]判断站点访问的终端类型(移动端还是pc端)的方法 - 司徒正美 - 博客园

mikel阅读(1428)

[转载]判断站点访问的终端类型(移动端还是pc端)的方法 – 司徒正美 – 博客园.

要了解某个网站是在移动设备上打开的还是在pc web浏览器中打开的,我们可以有以下综合的几种方式来搞定:

通过判断Request.UserAgent中的具体信息来分析判断,因为UserAgent包含了很多的信息,所以我们可以根据其中的某些信息来进行判断,具体的判断方式如下:

(1)string strUserAgent = Request.UserAgent.ToString().ToLower();
 
if (strUserAgent != null){
 
  if (Request.Browser.IsMobileDevice == true || strUserAgent.Contains("iphone") || 
  strUserAgent.Contains("blackberry") || strUserAgent.Contains("mobile") || 
  strUserAgent.Contains("windows ce") || strUserAgent.Contains("opera mini") || 
  strUserAgent.Contains("palm")){
     Response.Redirect("DefaultMobile.aspx");
  }
}
 
(2)((System.Web.Configuration.HttpCapabilitiesBase)Request.Browser).IsMobileDevice
 
(3)public static boolean choose(String userAgent){       
                Agent.indexOf("WapI") > -1 || // Ericsson WapIDE 2.0  
                userAgent.indexOf("MC21") > -1 || // Ericsson MC218  
                userAgent.indexOf("AUR") > -1 || // Ericsson R320  
                userAgent.indexOf("R380") > -1 || // Ericsson R380  
                userAgent.indexOf("UP.B") > -1 || // UP.Browser  
                userAgent.indexOf("WinW") > -1 || // WinWAP browser  
                userAgent.indexOf("UPG1") > -1 || // UP.SDK 4.0  
                userAgent.indexOf("upsi") > -1 || //another kind of UP.Browser  
                userAgent.indexOf("QWAP") > -1 || // unknown QWAPPER browser  
                userAgent.indexOf("Jigs") > -1 || // unknown JigSaw browser  
                userAgent.indexOf("Java") > -1 || // unknown Java based browser  
                userAgent.indexOf("Alca") > -1 || // unknown Alcatel-BE3 browser (UP based)  
                userAgent.indexOf("MITS") > -1 || // unknown Mitsubishi browser  
                userAgent.indexOf("MOT-") > -1 || // unknown browser (UP based)  
                userAgent.indexOf("My S") > -1 ||// unknown Ericsson devkit browser  
                 userAgent.indexOf("WAPJ") > -1 ||//Virtual WAPJAG www.wapjag.de  
                userAgent.indexOf("fetc") > -1 ||//fetchpage.cgi Perl script from www.wapcab.de  
                userAgent.indexOf("ALAV") > -1 || //yet another unknown UP based browser  
                userAgent.indexOf("Wapa") > -1 || //another unknown browser (Web based "Wapalyzer")  
                userAgent.indexOf("Oper") > -1){
       return true;
   } else{
       return false;
   }
 
(4)if (HttpContext.Current.Request.Headers["user-agent"] != null && HttpContext.Current.Request.Headers["user-agent"].ToLower().ToString().IndexOf("mozilla") != -1){
                  HttpContext.Current.Response.Redirect("http://www. "); //PC
         }else{
                HttpContext.Current.Response.Redirect("http://wap "); //Mobile ClientTypeTesting.
         }

当然我们还可以根据设备的分辨率和屏幕大小来判断是移动设备还是pc设备,但是这个准确性比较低。

优酷的站点是通过网络的Ip地址来进行判断的,如果是移动网络,浏览器访问站点时就会跳转到3GP网站,否则就跳转到PC站点。

[转载]speeding up your web site 前端性能优化 - for certain - 博客园

mikel阅读(1540)

[转载]speeding up your web site 前端性能优化 – for certain – 博客园.

关注网站前端性能不得不提到一篇文章,Best Practices for Speeding Up Your Web Site,他来自yahoo性能研究团队,文章列出了7类35条网站提速的最佳实践。

Yahoo的最佳实践

1,内容

减少HTTP请求、减少DNS查找、避免重定向、缓存Ajax、按需加载组件、预加载组件、减少DOM元素的数量、分离组件到不同的域名、尽量不使用iframe、避免404

2,服务器

使用CDN、启用浏览器缓存(添加Expires或Cache-Control、配置ETags)、启用Gzip压缩、尽早刷新缓冲区、Ajax使用GET请求方式、避免Image标签src属性为空

3,Cookie

减小Cookie大小、为一些组件使用一个无cookie的域名

4,Css

Css文件引用放在顶部、避免使用Css表达式、避免使用@import、避免使用滤镜

5,JavaScript

js文件引用放在底部、将js的css代码放到单独的文件而不是页面内、尽量缩小js和css文件、移除重复脚本、减少DOM的操作、灵活的处理事件

6,图片

优化图片、优化图片的合并、不要在html中缩放图片、要一个favicon.ico并且要小和可缓存

7,手机(移动互联网

组件保持在25K以下、组件打包

Google的最佳实践

而同样的在互联网叱咤风云的google也有一个类似的项目叫Make the Web Faster,口号相当响亮,格调很高,他们从另一个角度给出了相似的网站性能的最佳实践。

1,优化缓存

浏览器的缓存和代理服务器缓存

2,减少往返时间

减少DNS查找、减少重写向、避免坏的请求、合并外部js、合并外部css、使用css背景定位来合并图片、优化样式脚本的加载顺序、避免使用document.write、避免CSS的@import、优先采用异步的方式请求资源、使用多个域名以实现并行下载

3,减轻请求的负担

尽量减少请求携带的数据、为静态文件的使用一个无cookie的域名

4,减小数量的大小

启用压缩、移除无用的样式、最小化js、最小化css、最小化html、推迟脚本的加载、优化图片、衡量图片的缩放、从一个统一的URL中请求资源

4,优化浏览器的呈现

使用有效的CSS选择器、避免使用CSS表达式、CSS文件放到页面的head里、指定图片的尺寸、指定一个字符集

5,针对移动设备的优化

推迟js的解析、使登录页的重写向可缓存

试验

再深入讨论这些规则之前,我们还是用实例来验证下这些规则最好。14 Rules for Faster-Loading Web Sites ,这个网站就从实验对这些规则进行验证。例如对于  Put Scripts at the Bottom 脚本放于页面底部  这一规则:就分别把脚本置于页面不同的位置进行试验,并且试图用其它的方法来解决位置不正确时带来的性能问题,最终得出结论。

辅助工具

更让我们庆幸的是,yahoo和google都各自推出了自己的性能分析的工具:yslowpagespeed,它们都提供了firefox扩展,以firebug标签展示,它们分别按照自己的最佳实践给你当前访问网页的评级和优化建议,让我们直接清楚的得知自己的站点还能有些什么优化的空间。

 

接下来会分别深入讨论这些规则。

———————————————–

推荐个之前的文章:构建高性能站点概要,http://www.cnblogs.com/forcertain/archive/2012/08/07/2626847.html

[转载]ASP.NET MVC框架应用如何移植到智能手机上

mikel阅读(1005)

[转载]ASP.NET MVC框架应用如何移植到智能手机上.

客户对我们的产品质量非常满意,因此在该项目完成后又给了我们另外一个订单,即部署客户程序到Windows智能手机设备上。但是我们项目团队成员以前都 没有这种开发经验。我们的计划是通过最小限度的修改现有程序代码,使其可以运行在Windows智能手机上。

  移动设备Web应用工具箱(Web Application Toolkit for Mobile Devices)

我们选择了微软移动设备Web应用开发工具箱作为解决方案。使用这个免费的工具,可以轻松将基于MVC框架的Web应用扩展到移动设备上。下载 地址:http://code.msdn.microsoft.com/WebAppToolkitMobile/Release /ProjectReleases.aspx?ReleaseId=3914

  该移动应用开发工具箱所需的环境要求是:

1、安装微软.NET Framework 3.5 SP1。

2、Visual Studio 2008专业版或更高版本。你也可以下载免费的微软Visual Web Developer 2008 Express版。

3、如果你的操作系统是Windows XP,则需要安装同步软件Microsoft Active Sync,以实现开发环境和设备模拟器之间的同步。

4、ASP.NET MVC框架,该框架也是免费的,你可以从MSDN或CodePlex上下载。

5、Windows Mobile SDK 6.0或更高版本。默认情况下,该SDK没有模拟器映像文件,你可从以下地址下载:http://www.microsoft.com /downloads/details.aspx?FamilyID=1A7A6B52-F89E-4354-84CE-5D19C204498A&displaylang=en

在安装了Web应用开发工具箱后,它将在你指定的位置创建一个名为WebAppToolkitMobile的文件夹。打开 WebAppToolkitMobile\VisualStudioTemplates文件夹,双击Mobile Web Application.vsi文件,将在Visual Studio 2008中创建一个新Mobile Application模板项目。现在打开你的Visual Studio 2008,并从“我的模板”分类中选择Mobile Web Application项目模板,并将你的项目命名为“TestMobileWebApplication”。另外根据向导要求增加一个单元测试项目。

ASP.NET MVC框架应用如何移植到智能手机上(图一)

点击查看大图
  图1

现在如果你看一下解决方案浏览器,它将有三个不同的项目。第一个项目名为“MobileCapableViewEngie”,它是一个类库型项目,其输出为一个主项目引用的程序集(.dll文件)。在运行时中,这个程序集将根据浏览器和设备类型来决定展现哪一个视图。

ASP.NET MVC框架应用如何移植到智能手机上(图二)

点击查看大图
  图2

举例来说,如果你想在你的ASP.NET应用中显示一个员工列表,而且你也希望为手机应用浏览器创建一个相同的列表,那么你需要创建两个不同的 视图。其中一个视图供IE浏览器使用,而另一个则是为手机网络浏览器所准备。你还可以为手机浏览器创建定制化的视图,因为手机和PDA显示屏可能非常小。 在多数情况下,开发者将为手机应用创建定制化的视图。MobileCapableViewEngine类的ViewEngineResult函数确定运行 时展现哪一个视图。

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)          {

ViewEngineResult result = null;

HttpRequestBase request = controllerContext.HttpContext.Request;

if (request.Browser.IsMobileDevice)

{

string mobileViewName = string.Empty;

mobileViewName = string.Format( CultureInfo.InvariantCulture, “Mobile/{0}/{1}”, this.RetrieveDeviceFolderName(request.Browser.Browser),viewName);

result = this.ResolveView(controllerContext, mobileViewName, masterName, useCache);

if (result == null || result.View == null)

{

mobileViewName = string.Format(CultureInfo.InvariantCulture,”Mobile/{0}”, viewName);

result = this.ResolveView(controllerContext, mobileViewName, masterName, useCache);

}

}

if (result == null || result.View == null)

{

result = this.ResolveView(controllerContext, viewName, masterName, useCache);

}

return result;

}

protected virtual ViewEngineResult ResolveView(ControllerContext controllerContext, string

viewName, string masterName, bool useCache)

{

return base.FindView(controllerContext, viewName, masterName, useCache);

}

接下来要做的事情是,在Global.asax文件的Application_Start事件中登记所有设备和浏览器类型。 MobileCapableViewEngine程序集配置了两个默认设备文件夹映射;一个是针对iPhone,被映射到View\Home \Mobile\iPhone文件夹,另一个是针对Windows手机,被映射到View\Home\Mobile\WindowsMobile文件夹。 在RegisterViewEngines函数中添加实例到引擎集合之前,开发者可以通过修改 MobileCapableWebFormViewEngine类的DeviceFolders属性,来实现删除或增加新文件夹映射。请看以下代码片段。

public static void RegisterViewEngines(ViewEngineCollection engines)

{

var engine = new MobileCapableWebFormViewEngine();

engine.DeviceFolders.Clear();

engine.DeviceFolders.Add(“Pocket IE”, “WindowsMobile”);

engine.DeviceFolders.Add(“AppleMAC-Safari”, “iPhone”);

engine.DeviceFolders.Add(“Safari”, “iPhone”);

engines.Clear();

engines.Add(engine);

}

  移植现有ASP.NET应用到手机

一旦设备和视图的登记完成后,拷贝粘贴现有ASP.NET MVC框架应用(你希望移植到手机的项目)到TestMobileWebApplication项目中。反之,你也可以增加 MobileCapableViewEngine程序集到你现有MVC项目中,以进行必要的修改。

下面我将用到之前使用MVC框架2.0创建的员工管理应用。这个应用有四个视图:创建员工、编辑现有员工数据、显示所有员工数据和显示特定员工 数据。我已经把员工管理应用中所有相关文件拷贝到TestMobileWebApplication项目中,并对RegisterViewEngine函 数进行了必要的修改。另外我还针对手机设备创建了新的定制化视图,并增加了一些针对手机应用的新管理页面。我还在Content文件夹下创建了分别针对普 通浏览器和手机浏览器的不同CSS文件。而且我对应用程序增加了错误处理功能。在增加了所有必需的组件后,如下图所示。

ASP.NET MVC框架应用如何移植到智能手机上(图三)

点击查看大图
  图3

在控制类中还需要进行另一处改动,此前对于任何Http请求,你的应用程序代码需要将其重定向到特定视图,现在你需要调用 MobileCapableViewEngine类的FindView函数,这个函数能够识别浏览器类型,并将你的请求重定向到相应的定制化视图。 51CTO开发频道也向您推荐《ASP.NET MVC框架视频教程》,以便于您更好的了解ASP.NET MVC框架。

  使用模拟器测试你的应用

Microsoft Mobile SDK 6.0已经安装了相关模拟器。为了测试你的应用,首先你需要设置设备管理器和模拟器。双击设备模拟器管理程序(dvcemumanager.exe),它 的存放路径为:C:\Program Files\Microsoft Device Emulator\1.0。

ASP.NET MVC框架应用如何移植到智能手机上(图四)

  图4

如果你的本地系统是Windows XP,你还需要配置Microsoft Activesync。右键点击Windows任务栏上的Active Sync图标,并选择“Open Microsoft ActiveSync”,从文件菜单中选择连接设置。

参考图4设置你的ActiveSync连接。然后在设备模拟器管理工具中选择“Mobile Classic Emulator”并右键点击,选择连接选项。这样将会打开Windows Mobile Classic Emulator,首次打开可能需要40-45秒时间。右键点击运行的模拟器管理工具映像,并选择Cradle选项激活ActiveSync,你将会看到 一个同步向导界面。

ASP.NET MVC框架应用如何移植到智能手机上(图五)

  图5

不要选择向导中的任何选项,点击完成。现在我们已经可以在Windows Mobile Emulator中测试应用。该模拟器如下图所示。

ASP.NET MVC框架应用如何移植到智能手机上(图六)

  图6

现在回到Visual Studio编辑器中,按F5执行该Web应用。下图显示了普通IE浏览器中的已有员工列表。

ASP.NET MVC框架应用如何移植到智能手机上(图七)

点击查看大图
  图7

要想在微软系统手机浏览器中显示相同的员工列表,我使用了一个定制化视图,只显示员工信息的部分内容。如下图所示:

ASP.NET MVC框架应用如何移植到智能手机上(图八)

  图8

通过ASP.NET MVC Framework,我们可以灵活的向项目中增加新定制化视图模板。借助于文本模板转换工具箱(Text Template Transformation Toolkit ),你可以最大限度的定制你的ASP.NET MVC现有视图模板。

[转载]google chrome插件开发,自己动手,丰衣足食 - 中国大兵 - 博客园

mikel阅读(980)

[转载]google chrome插件开发,自己动手,丰衣足食 – 中国大兵 – 博客园.

因为平时上网都用chrome,但总感觉除了速度快,简洁以外总还有地方满足不了我的需要,然后找插件…后来发现,插件虽然海量但找个 称心如意的也不是件容易的事儿,用在找插件的时间都能自己写一个了,于是,今年夏天开始的闲暇时间也写了几个,然后在应用中心断断续续发布了,这些插件原 本是给自己用的,但也有几个用户专门找我提出了他们的需求。

从开始的不懂到现在三两下就能玩儿一个,走了点远路,今天在这里写下从开发到发布的简单流程,都是很简单的知识

一个可用的插件至少包括一个manifest.json和一个js文件

manifest.json

每个插件都有个manifest.json文件,此文件相当于C里的main(),文件结构是典型的json对象:

{
"name": "应用名字",
"description":"应用的描述,以后发布到商城里,看到名字后第二看到的信息",
"version": "1.0",
"background": { "scripts": ["list.js","background.js"] },//后台运行的文件,比如相应插件消息的函数所在的文件等
"permissions": [
"tabs", "bookmarks","http://*/*","https://*/*" //插件运行“位置”,tab页、书签页、网页等
],
"browser_action": {
"name": "Click to change the icon's color",
"default_title": "指向插件图标时显示的提示信息,可以有换行转义字符如\n—————————————\n第一行\n·第二行\n·第三行"
},
"icons": {"16": "icon16.png", "48": "icon48.png", "128": "icon128.png"},//配置插件各处显示的图标,其中包括在插件管理页面、应用商城中显示的图标等
"options_page": "options.html", //配置页面,无选项页面时不用设置
"manifest_version": 2, //这个必须是2,其他值在导致插件不支持新版本chrome浏览器
"web_accessible_resources":["greenrain.png","test.css","icon100.png"],//插件运行时,想在页面使用或引用的资源文件必须在此处标明一下,否则chrome不允许访问
"content_scripts": [
{//插件开始运行时立即导入的文件在此设置,必要的js文件在此处添加设置
"matches": ["http://*/*","https://*/*"],
"css": ["test.css"],
"js": ["jquery-1.7.2.min.js","xxxx.js"]
}
]
}

本文件有一点需要注意:那就是,千万记得本文件不要加注释……正式发布时候没有提示的,只是提示不成功,郁闷(//和/**/都不行,上边的代码有注释是为了说明功能。)不要加注释啊不要加注释啊……
xxxx.js

需要执行的页面操作在本文件中完成,典型的包括dom操作、消息请求等

(function ()
{
var profile = [],test=10;
alert("插件正在运行");
chrome.extension.sendRequest({ method: "getProfile" ,number:test}, function (response)
{//发起请求,获取基本配置
if (response.data != undefined &amp;&amp; response.data != "")
{
alert("插件收到消息");
}
}
})();

background.js

通常用于处理接收消息、操作插件运行数据、浏览器行为调用等,比如图标显示、提醒。

(function ()
{
chrome.browserAction.setIcon({ path: "img/icon0.png" });//图标
})();
var min = 0, max = 10, current=0;
function updateIcon(number)
{
chrome.browserAction.setIcon({ path: "icon" + current + ".png" });//切换图标

if(number){
if (number == 0) number = "";
chrome.browserAction.setBadgeText({ text: String(number) });//更新图标提示文字
}
else{
chrome.browserAction.setBadgeText({ text: String(current) });//提示透明度文字
}

chrome.tabs.executeScript(null, { code: "document.getElementById('testDom').style.opacity = " + parseInt(current) / 10 + ";" });//点击图标即时执行脚本调整透明度

current++;
if (current &gt; max)
{
current = min;
}
}
chrome.browserAction.onClicked.addListener(updateIcon);//添加监听事件
chrome.extension.onRequest.addListener(function (request, sender, sendResponse)
{//返回请求数据
if (request.method == "getProfile")
{
var counter = request.number;
updateIcon(counter);
sendResponse({"test":"result"});
}
});

注:以上代码说明用,可能有错

配置页面

通常是设置用户保存的数据,有人用cookie,我比较喜欢用localstorage储存,反正不用考虑浏览器兼容问题等。

关于发布

chrome应用商店发布应用不收费已经是过去式,现在要想发布个插件得先拿5美刀好处费给谷歌,“此路是我开,此树是我栽,要想……”,谁让咱在 人家的路上走呢,乖乖交钱才行。不过有个问题需要提醒一下:付账时候大陆是不能直接付款的,选择国家要选择中国香港,信用卡也不是全支持,我只知道用招行 付款成功。发布了之后当然希望用户越来越多,但是发现推广这个活儿还真不会。

 

 

以下是我做的几个插件,同为码农的你也可能会有用,也顺便打个小广告;-)

第一个插件:“网页记单词

上网时间一多就有点后悔的感觉,然后就想把平时上网的时间用来背几个单词,找了很久没找到合适的插件,得,自己动手,于是乎第一个插件诞生。单击插 件图标调整透明度,单词从屏幕上一条一条闪过,对鼠标设置了有影无形,不耽误操作,提供的单词表满足不了需要时还可以自己配置,英法德意日、提醒什么的各 种东西随便塞。

 

第二个插件:“聚光灯

这是在完成第一个插件余温未散的情况下完成的,这个插件可以让用户专心致志读网页上的某一部分,用鼠标拾取dom,其余的用遮罩盖住,想看其他地方 随便一点就能复原,还加了快捷键和视频高亮,在应用商店里有个“关灯看视频”用户已经达到了几十W!我发现我这个比他那个好用的多,但是不会推广,用户没 几个……这个插件同时提供了中英文版本。

还能这样:

 

第三个插件:“屏蔽微博广告

昨天刚刚完成的一个。近段时间发现现在再上新浪微博没有以前舒心了,很喜欢的用户都特么在发各种广告、推荐关注,本来是来散散心,结果弄了个心烦意 乱,一下午搞定,用起来还不错,对于广告微博的识别率还是相当高的。用上了就发现那几个“全球XXX”真恶心,各种广告,有的甚至全部都是,取消关注。

最后希望本文对你有用。

[转载]Windows程序员进阶应该看的那些书 - SolidMango - 博客园

mikel阅读(905)

[转载]Windows程序员进阶应该看的那些书 – SolidMango – 博客园.

Windows程序员进阶应该看的那些书

 

业内有一个普遍的现象,一般Windows程序员在写了3-5年的代码的时候会有一段迷茫期,因为这个时期的程序员已经掌握了常用的一些编程技巧,对某种编程语言已经比较熟悉,可以完成常规的任务,但是这个时候的程序员也很容易迷茫。主要的表现有以下几种:

第一种,开始不停尝试不同的编程语言,但是慢慢的发现,其实语言大同小异,疲于学习,收获不大。
第二种,开始转向linux平台,总认为别人干的活比自己好,比自己牛,结果是常常没有足够的时间,疲惫于学习自己工作中根本用不到的知识,花了很大的精力却收获很少。
第三种,认为自己很牛了,沉迷于自己的一种技术甜区,不思进取。
有句话说的好,没有量的积累就没有质的飞跃,不经历过一定的项目和代码的熏陶,以及几米厚的书籍的积累,质变确实困难。
首先声明的是,本文所写的都是个人见解,只是希望后来人少走些弯路,欢迎讨论,但是言语之争就算了。
下面开始介绍indows程序员进阶应该看的那些书,
第一本:windows internals
推荐理由:
这 本书的作者是,Mark E. Russinovich,windows历史上的传奇人物,SysinternalsSuite的作者之一,著名的processexp, process monnitor, Dbgview 都出自这个团队,本书讲述了windows的底层关键机制、windows的核心组件(包括进程/ 线程/ 作业、安全性、i/o系统、存储管理、内存管理、缓存管理、文件系统和网络),并分析了启动进程、关机进程以及缓存转储,伴随着widnows NT 这本书已经出了几个版本,最新的版本是6.0。

第二本:Windows内核原理与实现
推荐理由:
这 本书是国内著名的技术翻译作者写的windows技术相关的书籍中比较不错的,全书解析了Windows如何实现操作系统的各个关键部件,包括进程、线 程、物理内存和虚拟内存的管理,Windows中的同步和并发性支持,以及Windows的I/O模型。值得一提的是书中讲解了部分的Windows Research  Kernel代码,从代码学习确实可以达到更好的效果。
但 是提到这本书有一点让人不吐不快:说实话,我读完这本书并没有收获太多windows internals里面没有的知识,但是看了一些代码确实让人受益匪浅,还有更重要的一点,本书的意图是帮助大家从源代码的角度剖析windows NT, 而且微软已经提供了源代码WRK,但是本书为了讲解一些技术细节而实现的几个小工具竟让没有开源,只提供了可执行文件,而且这几个小工具只能在有限的几个 版本的系统上运行,对学习本书造成了很大的不便。另外运行这几个工具的时候很可能让你的系统蓝屏,死机,请务必小心,个人对这种行为很是费解,所谓写书就 是为了剖析本质,而用于剖析本质的具体的小工具却不随书附带源码,这种行为使这本书的价值大打折扣。

第三本:Advanced Windows Debugging: Developing and Administering Reliable, Robust, and Secure Software
推荐理由:
这本书是windows 调试领域的神作,里面介绍的东西面很全,如果还没有开始,建议从这本书开始,而且这本书有中文版,全书有聂雪军翻译,读起来比较顺畅。

第四本:软件调试:Software Debugging
张 银奎老师写的书,可能很多人没有听过这个名字,但是一般业内的人都知道他,张老师的钻研精神和坚持精神是值得我们尊敬的,他写的这本书倾注了很多的心血, 第一遍都这本书的时候我还很年轻,没有完全理解。直到听了一次张老师的课,在第二遍读的时候,我才明白其中的乐趣,强烈推荐本书,张老师几万一天的的课, 精华都在这本书里面。

总结
本文列出了Windows程序员进阶应该看的那些书,当然,还有一些书也不错,由于篇幅的原因,本文暂时写这些,更多精彩内容待续..

 

[转载]web服务器apache架构与原理 - 虫师 - 博客园

mikel阅读(889)

[转载]web服务器apache架构与原理 – 虫师 – 博客园.

web服务器                                                                               

 

  在开始了解Apache前,我们先熟悉一下web服务器,因为apache也是web服务器的一种。

  Web系统由客户端(浏览器)和服务器端两部分组成。Web系统架构也被称为B/S架构。最常见的Web服务器有Apache、IIS等,常用的浏览器有IE、Firefox、chrome等。 当你想访问一个网页时,需要在浏览器的地址栏中输入该网页的URL(Uniform Resource Locator,简称为URL)地址,或者是通过 超链接链接到该网页。浏览器会向该网页所在的服务器发送一个HTTP请求,服务器会对接收到的请求信息进行处理,然后将处理的结果返回给浏览器,最终将浏 览器处理后的结果呈现给用户。

 

web服务器端的工作流程

(1)客户端发送请求

  客户端(通过浏览器)和Web服务器建立TCP连接,连接建立以后,向Web服务器发出访问请求(如get)。根据HTTP协议,该请求中包含了客户端的IP地址、浏览器的类型和请求的URL等一系列信息。

(2)服务器解析请求

  Web服务器对请求按照HTTP协议进行解码来确定进一步的动作,设计的内容有三鼐要点:方法(GET)、 文档(/sample.html)、和浏览器使用的协议(HTTP/1.1)其中方法告诉服务器应完动的动作,GET方法的含义很明显是:服务器应定位、 读取文件并将它返回给客户。

Web服务器软件现在就知道了,它应该找到文件/sample.html,并使用HTTP/1.1协议将内存返回给客户。信息是经过与请求到来相同的连接发出的,所以服务器不需要定们客户或创建新的连接。

(3)读取其它信息(非必须步骤)

    Web服务器根据需要去读取请求的其它部分。在HTTP/1.1下,客户还应给服务器提供关于它的一些信息。元信息(metainformation)可用来描述浏览器及其能力,以使服务器能据此确定如何返回应答。

(4)完成请求的动作

  若现在没有错误出现,WWW服务器将执行请求所要求的动作。要获取(GET)一个文档,web服务器在其文档树中搜索请求的文件(/sample.html)。这是由服务器机器上作为操作系统一部分的文件系统完成的。若文件能找到并可正常读取,则服务器将把它返回给客户。

如果成功:文件被发送出去。

  首先,web服务器发送一个状态码及一些描述信息。既然文件已经找到,则发送状态码200,表示一切都 OK ,文档随后发出,因为发送的信息是HTML文档,所以Content-type 取值为text/html。文档长为1024个字节,所以 Content-type 取1024 。服务器软件的标识及文件的时间属性信息也被包含在头域中。

如果失败:返回错误指示。

  如果请求的文件没有找到或找到但无法读取,测请求无法满足。这时将返回不同于200的状态码。最常见的问题是请求中的文件名拼写有误,所以服务器无法找到该文件。这种情况下,服务器将发送一个状态码—404 给客户。

(5)关闭文件和网络连接,结束会话。

当文件已被发邮或错误已发出后,web服务器结束整个会话。它关闭打开的的被请求文件,关闭网络端口从而结束网络连接。有关的其它工作则是由客户端来完成的,包括接收数据,并以用户可读的方式呈现出来。这些与服务器无关。

 

 

apache架构                                                                             

  Apache 作为历史最悠久的web服务器,一直是web应用系统的首选,是世界上被广泛应用的web 服务器软件,它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的web服务器端软件之一,也是流行架构LAMP的重要组成部分。

  作为世界上最流行的Web服务器,Apache遵循的同样是HTTP协议,默认端口号为80。下面来是apache 架构图。

Apache 特点:

  •   支持最新的HTTP/1.1通信协议。Apache是最先使用HTTP/1.1协议的Web服务器之一,它完全兼容HTTP/1.1协议并与HTTP/1.0协议向后兼容。Apache已为新协议所提供的全部内容做好了必要的准备。
  •   支持多计算机平台。Apache几乎可以在所有的计算机操作系统上运行,包括主流的UNIX、Linux及Windows操作系统。
  •   配置文件简单,易操作。用户可以通过直接修改Apache的配置文件信息来修改Apache,操作起来十分方便。
  •   支持实时监视服务器状态和定制服务器日志。Apache在记录日志和监视服务器自身运行状态方面提供了很大的灵活性,可以通过Web浏览器来监视服务器的状态,也可以根据自己的需要来定制日志。
  •   支持多种方式的HTTP认证。
  •   支持Web目录修改。用户可以使用特定的目录作为Web目录。
  •   支持CGI脚本,如Perl、PHP等。
  •   支持服务器端包含指令(SSI)。
  •   支持安全Socket层(SSL)。
  •   支持FastCGI。
  •   支持虚拟主机。即通过在一台服务器上使用不同的主机名来提供多个HTTP服务。Apache支持基于IP、主机名和端口号三种类型的虚拟主机服务。
  •   跟踪用户会话。当用户浏览基于Apache的Web站点时,可以通过Apache的mod_usertrack模块对其进行跟踪。
  •   支持动态共享对象。Apache的模块可在运行时动态加载,这就意味着这些模块可以被装入服务器进程空间,从而减少系统的内存开销。
  •   支持多进程。当负载增加时,服务器会快速生成子进程来处理,从而提高系统的响应能力。
  •   支持第三方软件开发商提供的功能模块。比如Apache加载mod_jserv模块后可以支持Java Servlet,这样就可以运行Java应用程序了。
  •   支持多线程和多进程混合模型的MPM。 当MPM类型指定为worker时,由于是使用线程来处理,所以可以处理海量的请求,而系统资源的开销要小于基于进程的服务器。

 

Apache 工作模拟                                                    

 

  Apache 2.X  支持插入式并行处理模块,称为多路处理模块(MPM)。在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到apache的速度和可伸缩性。

  Worker MPM 使用多个子进程,每个子进程中又有多个线程。每个线程处理一个请求,该MPM通常对高流量的服务器是一个不错的选择。因为它比prefork MPM需要更少的内存且更具有伸缩性。

  Prefork MPM : 使用多个子进程,但每个子进程不包含多线程。每个进程只处理一个连接。在许多系统上它的速度和worker MPM一样快,但是需要更多的内存。这种无线程的设计在某些性况下优于worker MPM,因为它可在应用于不具备线程安全的第三方模块上(如 PHP3/4/5),且在不支持线程调试的平台上易于调试,另外还具有比worker MPM更高的稳定性。 

   (后面会介绍如果这两种模式以及apache更多的设置与监控等)

[转载]artTemplate1.4.0源码分析之artTemplate结构图 - Lovesueee - 博客园

mikel阅读(1109)

[转载]【原创】artTemplate1.4.0源码分析之artTemplate结构图 – Lovesueee – 博客园.

模板引擎,个人感觉是artTemplate在使用和性能上挺不错的,语法用的是原生的js语法,性能看官方的数据挺不错的。

不过有个疑问就是:在编译模板的时候,是用正则匹配性能高,还是循环分词性能高,这个暂且不说,比较过才知道。

artTemplate 是新一代 JavaScript 模板引擎,它在 v8 中的渲染效率可接近 JavaScript 性能极限,在 chrome 下渲染效率测试中分别是知名引擎 Mustache 与 micro tmpl 的 25 、 32 倍。

引擎支持调试。若渲染中遇到错误,调试器可精确定位到产生异常的模板语句,让富UI应用开发变得得心应手。

这一切都在 1.7kb(gzip) 中实现!

之后会把源代码注释发出来,先来一张结构图,结构图更容易读者对代码整体进行把握,如下: