[MVC]ASP.NET MVC For Visual Studio 2010 Beta 1

mikel阅读(763)

ASP.NET MVC For Visual Studio 2010 Beta 1

 Downloads & Files


Application AspNetMVC1.1_VS2010.exe

application, 1227K, uploaded Wed  – 612 downloads
Application Release Notes

application, 68K, uploaded Wed  – 228 downloads
Application ASP.NET MVC Snippets for VS2010 Beta 1

application, 8K, uploaded Wed  – 404 downloads

Release Notes

This release only applies to Visual Studio 2010 Beta 1
It contains the tooling and assemblies for ASP.NET MVC 1.0, but with the placeholder version 1.1.
Please see the full release notes included with this release for more details. You can also read the announcement on here.
There are some known issues with the release as noted in the release notes. If you run into problems, please see the following post.
Also included in this release are snippets. To install the snippets:

  1. Unzip "ASP.NET MVC Snippets.zip" into "C:\Users\<username>\Documents\Visual Studio 10\Code Snippets\Visual Web Developer\My HTML Snippets", where "C:\" is your OS drive.
  2. Visual Studio will automatically detect these new files.

[JavaScript]javascript数据类型转换

mikel阅读(732)

parseFloat 转换成浮点数
parseInt 转换成整数.

这两个函数都有些容错性的,比如"123abc"会变成123.
如果楼主希望更准确一些,其实可以判断一下,然后用eval,像这样

不过也可以使用这样的方法:
var a = "234" ;
a = a.replace(/(^[\\s]*)|([\\s]*$)/g, "");
if( a !="" && !isNaN( a ) )
{//如果是数字
a = eval( a )
}
else
{//如果不是数字
a = null
}

JavaScript有两种数据类型的转换方法:一种是将整个值从一种类型转换为另一种数据类型(称作基本数据类型转换),另一种方法是从一个值中提取另一种类型的值,并完成转换工作。

基本数据类型转换的三种方法:

1.转换为字符型:String(); 例:String(678)的结果为"678"
2.转换为数值型:Number(); 例:Number("678")的结果为678
3.转换为布尔型:Boolean(); 例:Boolean("aaa")的结果为true

从一个值中提取另一种类型的值的方法:

1.提取字符串中的整数:parseInt(); 例:parseInt("123zhang")的结果为123
2.提取字符串中的浮点数:parseFloat(); 例:parseFloat("0.55zhang")的结果为0.55
3.执行用字符串表示的一段JavaScript代码:eval(); 例:zhang=eval("1+1")的结果zhang=2

[MVC]AOP in Asp.net MVC

mikel阅读(925)

转载:http://www.cnblogs.com/me-sa/archive/2009/06/09/AopInAspNetMVC.html

不同的观点,开拓迥然不同的世界.

Another point of view can sometimes open up a whole new world.

                                                                                                —- HSBC

本文内容包括:

  1. SoC
  2. AOP
  3. AOP in ASP.NET
  4. AOP in ASP.NET MVC

 

SoC

Separation of concerns (SoC) is the process of breaking a computer program into distinct features that overlap in functionality as little as possible.

源文档 <http://en.wikipedia.org/wiki/Separation_of_concerns>

上面是维基百科中对SoC的定义,在不同的场景中Soc有着不同的含义

  • Soc是一个过程:SoC是一个将功能点分解以尽量减小功能交叉的过程.
  • SoC是软件开发的一个基本原则
  • SoC是一个指标:关注点的分离度

 

       SoC的实践体现在不同的编程模型(Programming paradigm),编程模型帮助开发者提高关注点分离度.过程化编程模型把关注点分解成多个过程.在面向对象编程中,关注点抽象为对象/.面向方面编程模型中,将关注点分解为多个"方面".

XOP 

        这里有一个非常有意思的思考,我们回顾一下上面三种编程模型的发展历程:面向过程编程模型是人们面对复杂问题的一种自然思路:功能分解.需求的不断变化,功能分解已经不足以应对变化,于是面向对象编程模型的最核心的方法论是抽象.通过在不同视角进行抽象,抽象之后概念视角和规约视角能够保证相对的稳定,具体实现的变化被隔离开.说到这里我们不厌其烦的再次回首面向对象设计原则:SRP原则和ISP原则.单一职责和接口隔离本质上就是在强调对变化的隔离.再具体一点,MVC设计模式也是在强调一种分离,只不过它的是把内容和展示做了分离.

 

AOP

Aspect-oriented programming (AOP) is a programming paradigm that increases modularity by enabling improved separation of concerns. This entails breaking down a program into distinct parts (so-called concerns, cohesive areas of functionality). All programming paradigms support some level of grouping and encapsulation of concerns into separate, independent entities by providing abstractions (e.g. procedures, modules, classes, methods) that can be used to implement, abstract and compose these concerns. But some concerns defy these forms of implementation and are called crosscutting concerns because they "cut across" multiple abstractions in a program.

源文档 <http://en.wikipedia.org/wiki/Aspect-oriented_programming>

上面的文字同样来自维基百科,我们来做细致解读:

     OOP引入封装、继承和多态性等机制来建立一种对象层次结构.当我们需要为分散的对象引入公共行为的时候,00P则显得无能为力。一个典型的例子:日志功能。日志代码往往水平地散布在所有对象层次中.而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码如权限检查、异常处理也是如此。这种散布在各处的无关的代码被称为横切(crosscutting)代码,在OOP设计中.它导致了大量代码的重复,而不利于各个模块的重用。本质上核心功能和权限检查之类的功能处于不同的维度,但是在实现的时候所有的代码都被平铺在同一个维度上了.简单看一下下面的示意图:

de  

      OOP解决横切代码的乏力,AOP将散落各处的却又重复的代码组织在一起,OOP工作的基础上进一步完成模块化.AOP解决这一问题的机制被称为"横切技术";横切技术实现有两种方式:一是采用动态代理技术,利用截取消息的方式.对该消息进行装饰,以取代原有对象行为的执行.二是采用静态织入的方式,引入特

定的语法创建“方面”.从而使得编译器可以在编译期间织入有关“方面”的代码通常将静态横切称为introduce

 

AOP in Asp.net

      AOP真的离我们很远么?举两个现实中Asp.net的例子:

  1. 我们要在用户访问若干页面的时候检查是否具有对该页面的权限
  2. 我们要为页面做内容的繁简体转换

     上面的两个问题你打算怎么解决?在每一个页面的Page_Load里面都做一下权限检查么?然后在页面事件的最后做一下繁简体转换?

   是的,我们的解决方法是做了HTTPModule.通过对用户请求的拦截,做权限检查.在页面输出到客户端之前获取控制权完成页面繁简体转换.我们发现这样做的好处是:1.对页面核心代码没有任何修改 2.控制灵活:一旦不需要做权限检查了,只需要注释掉Web.config对应的配置节就可以了.之所以能够获得这样的便利,本质上是因为我们做到了权限检查代码的模块化.我们将权限检查的功能和核心业务成功的分离开,而权限检查功能的切入方式就是通过消息拦截.

    我们把HTTPMoudle理解为一种动态横切,Web应用程序生命周期中的特定事件就是Join point.HTTPModule中对特定事件的绑定就是PointCut,执行逻辑是Advice,一个HTTPModule代表一个Aspect.也许有学院派的朋友会不同意我的看法.我个人的看法是AOP是一种思想,这种思想还没有一个严格的定义,AOP需要更多的实践可能性来丰富,它不拘泥于AspectJ或者Aspect#.

    在享受HTTPMoudle便利的同时,我们也发现了这种方案的特点:应用程序生命周期中所暴露的事件就是可利用的Join Point,由于在应用程序级实施横切,横切功能的粒度是应用程序级的.我们思考的方向自然走到这里:Asp.net是不是可以有一个更细粒度的横切实践?嗯哼,ASP.NET MVC出现了.

 

AOP in ASP.NET MVC

 上回书我们已经讨论过了Asp.netMVC生命周期,我们截取请求处理的其中一个片段,我们从ActionInvoker.InvokeAction方法开始讨论.基于上面对于AOP的思考,当我们再次审视下图的时候,呈现在我们面前的已经是一个个Join Point.下图中核心的代码执行逻辑是Action Execution–>ActionResult Execution –>View.Render.在这些核心功能的执行前后会成为我们的切入点,类似于应用程序事件的PrePost一样,我们看到了OnActionExecuting ,OnActionExecuted,OnResultExecuting,OnResultExecuted.

partlife 

    OutputCache是一个典型的方面应用,我们通过OutputCacheAttribute这样一个系统的默认实现来做具体分析:

 


  1/* ****************************************************************************
  2 *
  3 * Copyright (c) Microsoft Corporation. All rights reserved.
  4 *
  5 * This software is subject to the Microsoft Public License (Ms-PL). 
  6 * A copy of the license can be found in the license.htm file included 
  7 * in this distribution.
  8 *
  9 * You must not remove this notice, or any other, from this software.
 10 *
 11 * ***************************************************************************/

 12
 13namespace System.Web.Mvc {
 14    using System;
 15    using System.Diagnostics.CodeAnalysis;
 16    using System.Web;
 17    using System.Web.UI;
 18
 19    [SuppressMessage("Microsoft.Performance""CA1813:AvoidUnsealedAttributes",
 20        Justification = "Unsealed so that subclassed types can set properties in the default constructor.")]
 21    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
 22    public class OutputCacheAttribute : ActionFilterAttribute {
 23
 24        private OutputCacheParameters _cacheSettings = new OutputCacheParameters();
 25
 26        public string CacheProfile {
 27            get {
 28                return _cacheSettings.CacheProfile ?? String.Empty;
 29            }

 30            set {
 31                _cacheSettings.CacheProfile = value;
 32            }

 33        }

 34
 35        internal OutputCacheParameters CacheSettings {
 36            get {
 37                return _cacheSettings;
 38            }

 39        }

 40
 41        public int Duration {
 42            get {
 43                return _cacheSettings.Duration;
 44            }

 45            set {
 46                _cacheSettings.Duration = value;
 47            }

 48        }

 49
 50        public OutputCacheLocation Location {
 51            get {
 52                return _cacheSettings.Location;
 53            }

 54            set {
 55                _cacheSettings.Location = value;
 56            }

 57        }

 58
 59        public bool NoStore {
 60            get {
 61                return _cacheSettings.NoStore;
 62            }

 63            set {
 64                _cacheSettings.NoStore = value;
 65            }

 66        }

 67
 68        public string SQLDependency {
 69            get {
 70                return _cacheSettings.SQLDependency ?? String.Empty;
 71            }

 72            set {
 73                _cacheSettings.SQLDependency = value;
 74            }

 75        }

 76
 77        public string VaryByContentEncoding {
 78            get {
 79                return _cacheSettings.VaryByContentEncoding ?? String.Empty;
 80            }

 81            set {
 82                _cacheSettings.VaryByContentEncoding = value;
 83            }

 84        }

 85
 86        public string VaryByCustom {
 87            get {
 88                return _cacheSettings.VaryByCustom ?? String.Empty;
 89            }

 90            set {
 91                _cacheSettings.VaryByCustom = value;
 92            }

 93        }

 94
 95        public string VaryByHeader {
 96            get {
 97                return _cacheSettings.VaryByHeader ?? String.Empty;
 98            }

 99            set {
100                _cacheSettings.VaryByHeader = value;
101            }

102        }

103
104        [SuppressMessage("Microsoft.Naming""CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Param",
105            Justification = "Matches the @ OutputCache page directive.")]
106        public string VaryByParam {
107            get {
108                return _cacheSettings.VaryByParam ?? String.Empty;
109            }

110            set {
111                _cacheSettings.VaryByParam = value;
112            }

113        }

114
115        public override void OnResultExecuting(ResultExecutingContext filterContext) {
116            if (filterContext == null{
117                throw new ArgumentNullException("filterContext");
118            }

119
120            // we need to call ProcessRequest() since there's no other way to set the Page.Response intrinsic
121            OutputCachedPage page = new OutputCachedPage(_cacheSettings);
122            page.ProcessRequest(HttpContext.Current);
123        }

124
125        private sealed class OutputCachedPage : Page {
126            private OutputCacheParameters _cacheSettings;
127
128            public OutputCachedPage(OutputCacheParameters cacheSettings) {
129                // Tracing requires Page IDs to be unique.
130                ID = Guid.NewGuid().ToString();
131                _cacheSettings = cacheSettings;
132            }

133
134            protected override void FrameworkInitialize() {
135                // when you put the <%@ OutputCache %> directive on a page, the generated code calls InitOutputCache() from here
136                base.FrameworkInitialize();
137                InitOutputCache(_cacheSettings);
138            }

139        }

140
141    }

142}

143

 

下面对OutputCacheAttribute的特点做一个归纳:

  1.  OuputCache标签是应用在Controller级别上的,由于一个Controller可以对应多个View,所以它的粒度介于应用程序级和页面级之间
  2.  OuputCache标签是静态引入到Controller,在编译时完成OutputCache的引入而非运行时,是一种静态横切的实现
  3. OuputCache标签的执行的PointCut是OnResultExecuting
  4. OutputCacheAttribute的继承关系是:OutputCacheAttribute —–> ActionFilterAttribute—–>  FilterAttribute, IActionFilter, IResultFilter

我们今天的主角出现了,看一下ActionFilterAttribute的代码:

 

 1/* ****************************************************************************
 2 *
 3 * Copyright (c) Microsoft Corporation. All rights reserved.
 4 *
 5 * This software is subject to the Microsoft Public License (Ms-PL). 
 6 * A copy of the license can be found in the license.htm file included 
 7 * in this distribution.
 8 *
 9 * You must not remove this notice, or any other, from this software.
10 *
11 * ***************************************************************************/

12
13namespace System.Web.Mvc {
14    using System;
15
16    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
17    public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter {
18
19        // The OnXxx() methods are virtual rather than abstract so that a developer need override
20        // only the ones that interest him.
21
22        public virtual void OnActionExecuting(ActionExecutingContext filterContext) {
23        }

24
25        public virtual void OnActionExecuted(ActionExecutedContext filterContext) {
26        }

27
28        public virtual void OnResultExecuting(ResultExecutingContext filterContext) {
29        }

30
31        public virtual void OnResultExecuted(ResultExecutedContext filterContext) {
32        }

33    }

34}

35

 

 

   ActionFilterAttribute定义的实际上定义了四个PoinCut,可以看到这四个pointCut是虚方法,注释里面解释了这样做的缘由:可以按照需要来重写感兴趣的方法,就是编写Advice代码了;Asp.net HTTPModule实现本质上是读HTTP请求的拦截,而在Asp.net框架中通过ActionFilterAttribute定义了PointCut,从而创建了更多扩展的机会.除此之外,Asp.net MVC框架还提供了AuthorizeAttribute,HandleErrorAttribute等等常规"方面"默认实现,我们同样可以进行扩展.

    比较一下Asp.netAsp.netMVCAOP实现上的不同:

 

Asp.net

Asp.net MVC

AOP粒度

应用程序级

灵活的粒度控制

AOP实现方法

动态横切

静态横切

 

      Asp.net MVC继承了Asp.net的优良传统,同时Asp.net MVC框架承诺的更灵活,扩展性更好在这里有一个更好的体现.当我们耐心的做一下比较,我们发现这不是一句空话,而今天我们看到的灵活性和扩展性,也仅仅是一个"方面"而已.

[Flex]Flex与.NET互操作(十三):FluorineFx.Net实现视频录制与视频回放

mikel阅读(829)

      本文主要介绍使用FluorineFx.Net来实现视频录制与视频回放,FluorineFx如同FMS一样,除了有AMF通 信,RTMP协议,RPC和远程共享对象外,它同样具备视频流服务的功能。通过它我们可以非常方便的实现在线视频录制、视频直播、视频聊天以及视频会议等 类似应用程序的开发。

      在《FMS3系列(四):在线视频录制、视频回放 》这篇文章里我写了通过FMS来实现在线视频录制和视频回放的功能,客户端的开发和这篇文章是相同的,不同的是本文将使用Flex来开发。

      首先我们来看看使用FluorineFx服务端是如何开发的,建立ApplicationAdapter是必然的,这里我们为本文中的 示例程序建立的ApplicationAdapter为VideoApplication,并为其添加RemotingServiceAttribute 如下代码块:

namespace Fx.Adapter
{
    
/// <summary>
    
/// 视频应用
    
/// </summary>
    [RemotingService]
    
public class VideoApplication : ApplicationAdapter
    {
        
public override bool AppStart(IScope application)
        {

            
return base.AppStart(application);
        }
        
public override bool AppConnect(IConnection connection, object[] parameters)
        {
            
return base.AppConnect(connection, parameters);
        }
    }
}

 

      ApplicationAdapter模板所提供的方法在实际项目开发中根据自己的需求去重写,这里不作过多介绍。光是这样还是不能实 现视频的录制和回放的功能,这只是实现了基本的启动应用程序和客户端连接等基本功能,要想实现视频录制和回放,我们还得让 VideoApplication实现IStreamService接口,该接口提供了实现视频发布和播放的相应功能,其定义如下:

namespace FluorineFx.Messaging.Api.Stream
{
    [CLSCompliant(
false)]
    
public interface IStreamService : IScopeService, IService
    {
        
void closeStream();
        
int createStream();
        
void deleteStream(int streamId);
        
void deleteStream(IStreamCapableConnection connection, int streamId);
        
void pause(bool pausePlayback, double position);
        
void play(bool dontStop);
        
void play(string name);
        
void play(string name, double start);
        
void play(string name, double start, double length);
        
void play(string name, double start, double length, bool flushPlaylist);
        
void publish(bool dontStop);
        
void publish(string name);
        
void publish(string name, string mode);
        
void receiveAudio(bool receive);
        
void receiveVideo(bool receive);
        
void releaseStream(string streamName);
        
void seek(double position);
    }
}

 

      OK,有了应用处理器接下来在FluorineFx网站的apps中添加应用程序(VideoApp),并配置好由此处理器来处理视频录制和回放。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    
<application-handler type="Fx.Adapter.VideoApplication"/>
</configuration>

 

      要使用RTMP协议,那么配置RTMP通信信道肯定是不能少的,在配置文件WEB-INF/flex/service-config.xml中配置使用RTMP协议的通信信道。

?xml version="1.0" encoding="utf-8" ?>
<services-config>
  
<channels>
    
<channel-definition id="my-rtmp" class="mx.messaging.channels.RTMPChannel">
      
<endpoint uri="rtmp://{server.name}:1617" class="flex.messaging.endpoints.RTMPEndpoint"/>
    
</channel-definition>
  
</channels>
</services-config>

 

       于此FluorineFx服务器端“基本”算是完成了。下面转到客户端的开发,建立Flex项目并设计好界面,如下图:            
            

      建立与FluorineFx服务器上应用程序的连接,连接成功则将自己的视频数据显示到界面上,如下实现代码:

private function connectionServer(event:MouseEvent):void
{
    nc 
= new NetConnection();
    nc.connect(
"rtmp://localhost:1617/VideoRecord","beniao","123456");
    nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStautsHandler);
    nc.client 
= this;
}
private function onNetStautsHandler(event:NetStatusEvent):void
{
    
if(event.info.code == "NetConnection.Connect.Success")
    {
        cam 
= Camera.getCamera();
        
if(cam != null)
        {
            
this.myVideo.attachCamera(cam);
        }
        
else
        {
            Alert.yesLabel 
= "确定";
            Alert.show(
"没有检测到视频摄像头","系统提示");
        }
    }
}

 

      录制视频也就是将自己本机的视频摄像头获取的视频数据以及音频设备的数据附加到网络流(NetStream),使用网络流的publish()方法将流发布到服务器上,这和使用FMS是相同的。

private function onRecordVideo(event:MouseEvent):void
{
    
if(this.nc)
    {
        var mic:Microphone 
= Microphone.getMicrophone();
        ns 
= new NetStream(this.nc);
        ns.attachCamera(cam);
        ns.attachAudio(mic);
        ns.client 
= this;
        ns.publish(
this.videoName.text,"record");
        
        
this.btnStart.enabled = false;
        
this.btnEnd.enabled = true;                
    }
}
private function onStopRecord(event:MouseEvent):void
{
    
if(this.nc)
    {
        
this.nc.close();
        
this.btnStart.enabled = true;
        
this.btnEnd.enabled = false;
        
this.btnPlay.enabled = true;
    }
}

 

      停止视频录制的功能就更加简单了,直接断开当前客户端与服务器端的连接就可以,使用网络连接(NetConnection)的close()方法。 

             

     录制好的视频将会保存在网站下的apps/VideoApp/stream目录中,如下图:                              

            

      实现录制的视频回放实际上就是播放服务器上的一个.flv视频文件,同样需要先建立与服务器端的网络连接,通过网络流去加载指定的视频文件,最后将其显示到应用界面上。

private function onPlayVideo(event:MouseEvent):void
{
    nc 
= new NetConnection();
    nc.connect(
"rtmp://localhost:1617/VideoRecord","beniao","123456");
    nc.addEventListener(NetStatusEvent.NET_STATUS,onPlayNetStautsHandler);
    nc.client 
= this;
}
private function onPlayNetStautsHandler(event:NetStatusEvent):void
{
    
if(event.info.code == "NetConnection.Connect.Success")
    {
        ns 
= new NetStream(this.nc);
        ns.client 
= this;
        var video:Video 
= new Video();
        video.width 
= 320;
        video.height 
= 240;
        video.attachNetStream(
this.ns);
        
this.myVideo.addChild(video);
        
this.ns.play(this.videoName.text);
    }
}

 

      到此就完成了使用FluorineFx.Net来实现视频录制和回放的功能,接下来我们来看看FluorineFx对发布录制视频流以 及实况视频流的安全方面是怎么处理的。FluorineFx.Messaging.Api.Stream.IStreamPublishSecurity 接口就是专门用来处理发布流是的安全处理的,如果要对发布流进行安全方面的处理,那么就自定义一个实现该接口的安全策略类,在策略类里根据自己的实际情况 来处理安全设置。

      通过该安全策略类可以很方便的判断发布流的类型、流的名称以及对发布流进行授权等相关操作。如下安全策略类:

 

namespace Fx.Adapter
{
    
public class PublishSecurity : IStreamPublishSecurity
    {
        
public bool IsPublishAllowed(IScope scope, string name, string mode)
        {
            
//是否为录制流
            if (!"record".Equals(mode))
            {
                
return false;
            }
            
//文件名是否以test开头
            if (!name.StartsWith("test"))
                
return false;
            
else
                
return true;
        }
    }
}

 

      在应用处理程序里通过ApplicationAdapter提供的RegisterStreamPublishSecurity()方法注册安全策略,该方法的定义如下所示:

public void RegisterStreamPublishSecurity(IStreamPublishSecurity handler); 

      

      要注册发布流的安全策略,通常都是在应用程序启动中注册,如下代码块:

public override bool AppStart(IScope application)
{
    RegisterStreamPublishSecurity(
new PublishSecurity());
    
return base.AppStart(application);
}

 

      通过RegisterStreamPublishSecurity()方法注册好发布流的安全策略后,每次发布流都会通过自定义的安全 策略来检测当前发布流是否符合自定义的安全规则。这样一方便可以保证别人恶意连接到你的应用程序进行流的发布,消耗网络带宽等多中不利现象,更多的好处还 待研究。

本文示例程序下载: FluorineFxVideo.rar

 

版权说明

  本文属原创文章,欢迎转载,其版权归作者和博客园共有。  

  作      者:Beniao

 文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

 

[MVC]Asp.net MVC 示例项目"Suteki.Shop"分析之---结束篇

mikel阅读(748)

     到今天,这个系列的文章就要先告一段落了。其中我用了10篇文章也没有穷尽该项目的设计思想,只能从
中捡了一些我感兴趣的东西进行了分析和说明,正所谓兴趣是最大的动力。当然限于本人水平有限,难免有一
些认识上的错误,也希望大家在回复中与我进行交流。

    下面把一些还未穷尽的内容做一下罗列,以备感兴趣的朋友继续品味。
   
    1.项目中使用了“Rhino.Mocks”,有对单元测试和这个项目感兴趣的朋友可以通过测试代码研究一下。
   
    2.在下面三个文件夹下有大量的辅助类和扩展方法,其中有些代码大家可以很容易的移植到自己的项目中:
   
      Suteki.Common\HtmlHelpers
      Suteki.Common\UI
      Suteki.Shop\HtmlHelpers
     
    3.项目中使用了MvcContrib和MvcContrib.Castle,因为未对视图"View"(Suteki.Shop\Views)进行分析,
      所以就未详细说明。

    好了,完成这个系列之后,我要偃旗息鼓一段时间来处理个人的事情了。如果大家有什么问题,我可能不会
马上解释,望见谅!   

   
    最后希望ASP.NET MVC 的优秀项目越来越多,给我们提供更多有价值的参考,望 MVC 一路走好。
   
    下面是这个系列全部文章链接:
    
    Asp.net MVC 示例项目"Suteki.Shop"分析之—安装篇   
    Asp.net MVC 示例项目"Suteki.Shop"分析之—Controller 
    Asp.net MVC 示例项目"Suteki.Shop"分析之—Filter      
    Asp.net MVC 示例项目"Suteki.Shop"分析之—数据验证
    Asp.net MVC 示例项目"Suteki.Shop"分析之—ModelBinder
    Asp.net MVC 示例项目"Suteki.Shop"分析之—ViewData
    Asp.net MVC 示例项目"Suteki.Shop"分析之—Model和Service
    ASP.NET MVC 示例项目"Suteki.Shop"分析之—IOC(控制反转)
    Asp.net MVC 示例项目"Suteki.Shop"分析之—NVelocity模版引擎
    Asp.net MVC 示例项目"Suteki.Shop"分析之—NHibernate

    作者: daizhj,代震军,LaoD

    Tags: mvc,Suteki.Shop

    网址: http://daizhj.cnblogs.com/

    原文链接:http://www.cnblogs.com/daizhj/archive/2009/06/09/1494194.html

[blog]WordPress 2.8 RC 及中文包发布

mikel阅读(660)

伴随着WordPress 2.8 Release Candidate 1的发布,WordPress 2.8已经基本完成了,如果不出意外,这周三,也就是6月10号,WordPress 2.8将正式发布。 

欢迎大家积极测试,有问题可以留言,老生常谈的一句话:这个版本的程序主要是完成了WordPress主题的后台搜索、预览、安装。

WordPress 2.8 RC1下载地址:http://wordpress.org/wordpress-2.8-RC1.zip
Wopus版:WordPress 2.8 RC1的中文包

[Flex]Flash Builder 4 / Flash Catalyst 下载

mikel阅读(1098)

         6月1日,Adobe在今天中午发布了Flash Builder 4 Beta1和Flash Catalyst Beta1。

        需要特别说明的是Flash Builder 即原先的Flex Builder。名称的更改是Adobe方面希望统一开发软件名称的一个方式,即他们都基于FLASH平台。至于FLEX SDK/ framework 依然是以FLEX命名,FLEX的开发工作并不是只能用Flash Builder不可,所以该软件的更名对FLEX本身没有任何影响。

        在Flash Builder 4安装前会提示选择语言,该版本种包含了简体中文。建议选择,更便于日后的中文软件学习和交流。

        而Flash Catalyst之前的开发代号为Thermo。这是一个为FLEX设计师准备的软件,通过Catalyst,设计师与程序员可以更好的搭配之间的工作。目前airia正在编写Catalyst的入门教程。关于Catalyst更多的信息可以查看这里

 

官方主页:

Flash Builder 4 主页       Flash Catalyst 主页

下载地址:

Flash Catalyst    [ 下载地址一 for windows ]  序列号 1395-1003-6369-7619-0587-6556

Flash Builder 4    [ 下载地址一  for windows ]

更多相关下载:

for Eclipse  Download Flash Builder 4 Plugin for Windows (EXE, 314 MB)

AIRIA论坛跟进:

Flash Catalyst 开版   http://bbs.airia.cn/FlashCatalyst/list-1.aspx

Flash Builder 4 软件应用专版   http://bbs.airia.cn/Flash_Builder_4/list-1.aspx

新版 入门教程进入撰写阶段

 

 

新增功能:
Flex SDK
* 引入一个全新的功能强大的组件皮肤框架,叫做Spark。
* 基于Spark框架进行初始化的组件可以与Flex3中的Halo组件集合混合和匹配使用。
* 支持声明化的,动态的MXML图形,以及FXG格式的图形。
* 全新的Spark默认外观,支持全新的样式集合。
* 更强大的布局支持,包括支持MXML图形元素,增强对于翻转和其他变形的支持,支持指定自定义的布局,增强z轴管理。
* 一些新的和增强的特效,包括支持MXML图形元素的动画,通过自定义的动画修改,更多易用的API调用方式,更多的自动化的交互行为。
* 3D特效支持
* Flash动画滤镜,包括Pixel Bender。
* 更多高级字体支持。基于Flash Text 引擎和Text布局框架,也支持CFF(Compact Font Format)。
* 编译器性能提升。
* 新的MXML语言功能,包括MXML 2009命名空间,声明,库和标签定义。
* CSS增强,包括支持命名空间,继承选择器,ID选择器,更多的类选择器和针对组件状态的伪选择器支持。
* 语法增强和状态states增强。
* 方便的数据双向绑定语法。
* ASDoc支持在mxml文件里的组件。
* 增强的HTML模板,基于SWFObject。
* adobe.com存放 SDK运行时共享库RSL。
* 额外的本地化支持,更好的开发本地化应用。
Flash Builder新功能
* 一个面向创建数据服务应用的新工作流(包括CF,PHP,Java,WebServices)。
* 支持由Flash Catalyst创建的FXG项目
* 一个全新的Network监控,帮助诊断客户端和服务器段的通讯问题
* Flex 单元测试整合。
* 自动生成getter和setter。
* ASDoc支持在MXML和AS中显示ASDoc注释
* 自定义文件模板支持MXML,AS和CSS文件。
* 自动生成事件处理函数结构。
* 调试器增强。
* Profiler增强。
* Refactoring增强
* 新的Component kit for Flash CS4
* 新支持命令行构建执行方式。
* 导入和应用Flex主题新用户界面。
* 新的Flex类包浏览器替代Flex Navigator面板。

[SQL] SQL2008中"阻止保存要求重新创建表的更改" 的处理

mikel阅读(810)

当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成表的更改,如果强行更改会出现以下提示: 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改”选项。

如果要去掉此提示,打开SQL 2008 在最上面

工具-〉选项-〉左侧有个 设计器-〉表设计器和数据库设计器 -> 阻止保存要求重新创建表的更改(右侧) 把钩去重新启动2008即可

[Flex]谈Flash Builder、Flash Catalyst与Flash Platform

mikel阅读(899)

原文链接:http://www.k-zone.cn/zblog/post/flash-buidler-flash-catalyst-flash-platform.html

之前写了一篇叫做《为什么国内的公司都不敢使用Flex作为产品的平台与主要开发语言》 的文章,其中有一个观点:名称混淆,其中描述了Flash、Flex Builder、Flex SDK、Flash IDE(CS4)等产品的名称非常的模糊,不利于初学者掌握和使用。举个最简单的例子,我跟其他人称呼我是Flex开发人人员?ActionScript 开发人员的时候,不懂的朋友都会反问我,你是搞Flash的吗?(-.-)=3
5月16日Adobe发布了一个重磅级的消息,下一代Flex Builder,即Flex Builder 4.0(是IDE,而非SDK),将改名为Flash Builder。截止到现在基本上已经时隔将近一周的时间,那么我来谈谈我对这次改名事件的看法。
我们得知Flex Builder → Flash Builder,但是不变的是Flex SDK的名称,仍旧叫做Flex SDK。相对与Adobe来说,这只是一个技术层面的修正。
而从更高的层面看待Adobe的产品,不难可以发现如下的一些信息。
Adobe CS(4) 套装:包含了Photoshop、Dreamweaver、Fireworks、Flash IDE等一些常用的设计工具,而这些工具基本上是面向设计人员的,可以称之为设计工具。

Flex SDK、MXML、ActionScript 3.0、AIR:这些产品无须质疑,全部都是面向开发人员的,可以称之为编程语言、框架。
BlazeDS、LCDS、FMS等:同样无须质疑的是,这些产品都是面向服务器端的产品,可以称之为服务器端。
okay,让我们看一下下面这个例图:

从上图可以看到,目前来说Adobe有了设计工具、有了自己的编程语言、框架类、也有了服务端的产品,但是似乎它们之间的产品联系少了一些,尤其是工具类的使用之与服务器端、框架类的使用人员的联系少了一些。
因此Adobe提出了Flash Catalyst的概念,而Flash Catalyst是针对于交互设计师的工具。
Adobe的想法:

1、让Flash Catalyst来读取Photoshop、Fireworks等设计工具的设计资源,然后在其中完成交互部分的工作。
2、Flash Catalyst可以导出为Flash Builder 4可以理解和解析的内容。
3、最终由开发人员使用Flash Builder 4等工具来完成主要的逻辑功能部分。
4、最终也可以搭载Adobe的服务器端产品:BlazeDS、LCDS、FMS。
因此Flash Catalyst的作用不仅仅在于交互设计,而是将Adobe的这三种相对于孤立的产品形成一个体系。
请看下图: 

 

 

通过上图,很容易可以看出Flash Catalyst让Adobe产品更像是一个整体。而这一切,其实已经被Adobe定义成了一个平台级别的产品:Flash Platform。

让我们再回头看一下Flash Builder的真正含义。

这次改名事件可以让Flash Platform的产品更加的明确化。例如一提到CS系列,则会让人马上想到的是Photoshop等设计工具,提到Flash Catalyst则让人想到的是交互工具。提到BlazeDS、LCDS、FMS则会想到服务器端产品。

未改名前的话,会出现什么情况呢?提到Flex,那么它到底代表的是SDK、还是IDE呢?因为SDK、IDE都叫做Flex XXXX,更莫名其 妙的是AIR的IDE也称之为Flex XXXX,这就真的让人头大了。而无论是 Flex SDK(Framework)、XMML、ActionScript 3.0、AIR其实本质上都是swf,也就是都是Flash。

因此如果我们把Flex Builder改名为Flash Builder的话,这个系列的产品则更加的清晰。

例如:提到Flex,则指的就是Flex SDK(Framework)、提到MXML、ActionScript 3.0则指代的就是编程语言、提到AIR,则指代就是AIR Framwork。而提到Flash Builder,则会马上知道它是IDE,即可以编写、编译、运行、MXML、ActionScript 3.0。同时也是Flex、AIR的编写IDE。

也就是说,Flex被定义成了框架的名字,这样一来,就与AIR的概念是一样的。那么大家记住,Flex是一个框架,是什么框架呢?就是Flash的一种框架,看这样是不是很清晰了呢!

改名的另外一个好处则是:

1、当有人问我的时候,我可以说自己是Flash开发人员,那么这些人就会知道我会使用Flex、AIR、MXML、ActionScript 3.0这些内容。

2、如果使用Flash CS(4)的朋友可以称之为Flash设计人员。

3、如果使用Flash Catalyst的朋友,则可以称之为产品交互人员。

看,这样多清晰:)你说对吗?

最后一图(Flash Platform):


最后再猜测一点:
Flash Platform战略慢慢浮出水面,是与Microsoft的WPF与Silverlight战略是息息相关的。:)