Tailspin Travel 是一个旅游预订的应用程序示例,最新版本采用ASP.NET MVC 2技术构建,主要使用 DataAnnotations 验证, 客户端验证和ViewModels,还展示了许多Visual Studio 2010, .NET Framework 4, 和Windows Server AppFabric的技术,参看ASP.NET MVC 2示例Tailspin Travel。

Tailspin Travel设计的技术比较多,今天我们来看看界面(UI)上的技术,在UI层上来说主要采用的技术是ASP.NET MVC2和ASP.NET DynamicData框架。从功能上来分为向普通用户提供的前台页面和管理员使用的后台界面,前台页面主要实现的是旅游活动日程安排,航班,酒店,租车这几部分采用的ASP.NET MVC 2技术,管理员用的后台管理页面使用的是ASP.NET DynamicData开发的,这两种技术在网站里的应用有示范作用,对于管理员使用的后台的访问量不可能很大,网站的主要流量是普通用户使用的前台页面,组合使用这两个框架,可以加快网站的开发。

组合这两种技术,就会碰到一些的问题,第一个问题就是ASP.NET 动态数据(Dynamic Data )默认情况下,动态数据放在web应用的动态数据目录(DynamicData)里,该目录创建在根目录处。你的应用需要移动的不同的位置。 在Tailspin Travel里面是“admin”目录,动态数据就在这个目录下,然后在Globa.asax.cs文件里

var metaModel = new MetaModel();
metaModel.RegisterContext(contextFactory, new ContextConfiguration { ScaffoldAllTables = true });
metaModel.DynamicDataFolderVirtualPath = "~/Admin/DynamicData/";

改变admin/Dynamicdata 下文件的内容的引用到新的路径((~/admin/Dynamicdata)
例如:
A、修改List.aspx和ListDetails.aspx 的注册指令的src属性。
B、修改 List.aspx 和母版页的img 的src属性。
C、任何自定义的必须使用新路径的内容。

ASP.NET 4.0有个新特性叫做“自动启动应用程序”,自动启动,先行初始化web应用,而不必等待外部客户端访问web服务器时才启动的能力。这可以有助于你给第一个访问者提供一个更快的回复体验,避免撰写定制脚本来“预热(warm up)”服务器和准备好任何数据缓存。它可用于任何类型的ASP.NET应用,包括基于ASP.NET Web Forms和ASP.NET MVC的应用。不过要求在IIS 7.5(随Windows 7和Windows Server 2008 R2发布)上运行 ASP.NET 4时使用。这个自动启动特性提供了一个可控制的方式来启动一个应用工作进程,初始化ASP.NET 应用,然后接受HTTP请求。具体参看Scott Guthrie 的文章 VS 2010 和 .NET 4.0 系列之《自动启动ASP.NET应用》篇,Tailspin Travel有个类Microsoft.Samples.Tailspin.Web.Infrastructure.ApplicationPreloader,就是用这个特性预先加载应用程序的缓存。

下面我们来具体分析前台和管理后台:

前台采用ASP.NET MVC 2开发,比较简单,主要是使用ViewModels,HtmlHelper,输出缓存,避免CSRF攻击,查询方法中使用PartialView,以及jQuery和ASP.NET Ajax配合的相关内容,可以参考 Asp.net MVC2 使用经验,性能优化建议学习。

下面重点来说明一下管理后台的DynamicData的结构,先可以阅读一下Scott Guthrie 的文章 新的ASP.NET动态数据支持:

ASP.NET 动态数据在进行创建和更新数据时还会对所录入的数据进行验证,这种验证既发生在客户端也发生在服务器端。

  • 必填字段验证。如果字段不允许为 NULL,则录入时必须录入数据。不过这里还有待改进,不允许为 NULL,也就成了不允许零长度字符串,而实际应用中 NULL 和零长度字符串是两回事。纵然不够完美,也已经为我们减轻不少工作量了。
  • 长度验证。如果字段类型为 nvarchar(10),那么就不允许超过 10 个字符;如果字段类型不是 nvarchar(10),而是 varchar(10),此时六个汉字也会通过验证,只是无法入库罢了,会返回错误。
  • 类型验证。比如字段是日期类型,则只允许录入日期。

ASP.NET 动态数据具有自动格式功能:比如 bit 类型的字段显示为一个多选框,而标识字段不会在插入数据时显示出来。

ASP.NET 动态数据还具有自动识别表关联的功能:比如产品表与产品类别表进行了关联,那么我们在录入产品数据的时候,ASP.NET 动态数据会自动以下拉列表的形式显示产品类别。此功能非常不错。

在网站或者应用程序模板中有两个Dynamic Data模板,一个是 "Dynamic Data实体模板(Dynamic Data Entities )"它是使用ADO.net Entity作为数据模型的,另一个是 "Dynamic Data 模板",他是使用LINQ TO SQL 来作为数据模型。Tailspin Travel 是以Entity Framework作为数据模型的。

Dynamic Data也使用了Routing:

routes.Add(new DynamicDataRoute("Admin/{table}/{action}")
            {
                Constraints = new RouteValueDictionary(new { action = "List|Edit|Details|Insert" }),
                Model = metaModel
            });

routes.Add 的参数为一个 DynamicDataRoute 对象,而该 DynamicDataRoute 对象有一个参数为 "Admin/{table}/{action}.aspx",另外还为该对象指定了两个属性值 Constraints 和 Model。把一个继承自Route的DynamicDataRoute添加到Routing规则表中。

Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }) 这句表示约束,这里表示 action 只能是 List、Details、Edit、Insert 中的一个。

可以看出,这四个Aciton是对应着DynamicData/PageTemplates文件夹中的四个页面文件。在那文件夹中还有一个ListDetails.aspx页面文件,是用于"合并页模式",就是所有的操作都会在一页中完成。Tailspin Travel并没有启用这个功能。DynamicData 文件夹的名称都是“DynamicData”。

上面的 {table}、{action} 可不可以改成我们自己想要的名字呢?

不行的,我们可以看到,上面使用的是 DynamicDataRoute 类,而不是 Route 类,DynamicDataRoute 继承于 Route,Table 和 Action 属性是 DynamicDataRoute 特有的。

DynamicData/Content/GridViewPager.ascx 分页控件。

DynamicData/Content/FilterUserControl.ascx 在显示表中的数据时,该控件显示在表头,用以过滤表中的内容,比如可以只列表产品目录为“实用工具”的产品。

DynamicData/CustomPages 文件夹。自定义网页模板文件夹,可用以替换 DynamicData/PageTemplates 文件夹中的默认模板。

DynamicData/FieldTemplates 文件夹。包含各种类型的字段在查看和创建、编辑时所呈现的控件。

DynamicData/PageTemplates 文件夹。包含在进行查看、编辑时的页面模板。

Dynamic Data还有一个快速开发的基础是脚手架,脚手架是一种机制,通过脚手架,我们不必再为每一个表的增加、查看、修改做不同的页面,因为脚手架会自动生成这些页面。Tailspin Travel对所有表都启用脚手架,对所有表启用脚手架表示公开了整个数据模型:

metaModel.RegisterContext(contextFactory, new ContextConfiguration { ScaffoldAllTables = true });

还可以对特定表启用脚手架功能,这时就要将上面的ScaffoldAllTables = false,然后给模型类打标签[System.ComponentModel.DataAnnotations.ScaffoldTable(true)]

自动生成的网站需要我们调整的页面,需要创建自定义的页面可以把它放在DynamicData/CustomPages 文件夹,在 DynamicData/CustomPages/ 下新建一个文件夹,名称为 FlightBookings,这个名称一定要与 Tailspin.edmx中的相应表的分部类名称一样。然后将 DynamicData/PageTemplates/ 下的文件复制到 DynamicData/CustomPages/FlightBookings/。

更改新模板文件中的类名。

比如将类名称 List 改为 DynamicDataTest.FlightBookingsList。

使用DisplayName更改界面的显示,DisplayName 只能用于类、方法、属性、索引、事件

[MetadataType(typeof(CarRentalMetadata))]
    public partial class CarRental
    {
        [ScaffoldTable(false)]
        private class CarRentalMetadata
        {
            [DisplayName("Pick up")]
            public object RentalStart { get; set; }

[DisplayName("Return")]
            public object RentalEnd { get; set; }

[DisplayName("Pick up Place")]
            [Required(ErrorMessage = "Please specify where you prefer to pickup the vehicle.")]
            public object PickupPlaceId { get; set; }

[DisplayName("Return place")]
            [Required(ErrorMessage = "Please specify where you prefer to return the vehicle.")]
            public object ReturnPlaceId { get; set; }

[DisplayName("Vehicle")]
            [Required(ErrorMessage = "Please specify the vehicle type.")]
            public object VehicleTypeId { get; set; }
        }
    }

还可以用 UIHint,DataType 改变字段模板

[MetadataType(typeof(FlightMetadata))]
    public partial class Flight
    {
        public Flight()
        {
            this.Id = Guid.NewGuid();
        }

[DisplayName("Flights")]
        private class FlightMetadata
        {
            [ScaffoldColumn(false)]
            public object Id { get; set; }

[Required]
            public object AirplaneType { get; set; }

[UIHint("Time")]
            public object DepartureTime { get; set; }

[UIHint("Time")]
            [DataType(DataType.Time)]
            public object ArrivalTime { get; set; }

[DisplayName("Departure Airport")]
            public object DepartureAirport { get; set; }

[DisplayName("Arrival Airport")]
            public object ArrivalAirport { get; set; }
        }
    }

DynamicData非常的灵活,Tailspin Travel用来对付管理后台的开发方面具有非常高的效率,在前台使用MVC2保证性能,在UI界面的开发方面非常值得借鉴的一种模式。

ASP.NET MVC 2示例Tailspin Travel UI层分析相关推荐

  1. ASP.NET MVC 2示例Tailspin Travel

    Tailspin Travel 是一个旅游预订的应用程序示例,最新版本采用ASP.NET MVC 2技术构建,主要使用 DataAnnotations 验证, 客户端验证和ViewModels,还展示 ...

  2. 在ASP.NET MVC 4中使用Kendo UI Grid

    Kendo UI 是Telerik推出的一套based on jQuery 的 Framework,提供了很多控件(Menu .Grid .Combox等...), 底层以Html5 + jQuery ...

  3. Spring.net与Asp.net Mvc结合示例《转载》

    一.介绍 因为项目要用到Ioc框架,所以要为Ioc框架选型,优秀的Ioc框架好几款,例如:sping.net,castle,unity--当然还不止三款,还有其它的Ioc框架,castle跟unity ...

  4. Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 3 ----数据访问层

    在上一篇中,我们已经搭建起了整个解决方案的项目,并且建好了数据库,完成了实体类和Nhibernate映射文件.在本文中,将定义数据访问接口,并利用Nhibernate实现接口,利用Spring.net ...

  5. 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...

  6. 七天来学习ASP.NET MVC (两)——ASP.NET MVC 数据传输

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上.因此须要确保您是否掌握了上一节的内容. 本章的目标是在今天学习结束时利用最佳实践解决方式创建一个小型的M ...

  7. ASP.NET MVC 整合 Spring.net(1)- Controller进容器

    我们都知道Asp.net MVC自有一套执行机制. 通过分析MVC的MvcHandler关键代码 ProcessRequest         protected internal virtual v ...

  8. 使用Asp.net MVC, Jquery, Jquery UI构建基于Ajax的RIA应用.(更新Demo下载)

    前天初学Asp.net MVC,发现有些东西用Web Form来做的确会比较方便. 但Asp.net MVC也有它的优点. 它如果跟Jquery和Jquery UI结合起来做基于Ajax的应用实在是太 ...

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

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

最新文章

  1. ALD对照CVD淀积技术的优势
  2. CentOS6.5 下sciki-learn numpy scipy 的安装
  3. 允许用户把多个作业同时提交给计算机,2005年7月操作系统试题和答案
  4. container_of分析
  5. OpenGL版本与硬件支持
  6. Spring Security Java Config Preview--官方
  7. 【机器学习】GitHub 标星17.4K:机器学习 100 天!
  8. Android—逐帧、补间、属性动画
  9. netstat 相关命令解析
  10. h3c防火墙u200配置命令_h3c 防火墙清除配置
  11. linux里临时设置hbase参数,在centos下配置hbase环境并简单使用hbase shell
  12. asp.net最常用的三十三种编程代码
  13. C++中的错误处理方法(含示例代码)
  14. 直播丨2020年全国首场12c OCM直考揭秘
  15. 粒子群优化算法的实现
  16. 使用Tushare进行公司数据分析
  17. 11(3)-AirSim+四旋翼仿真-AirSim中人工势场法方法改进
  18. 服务器怎么改成gpt分区支持,硬盘mbr分区更改成gpt分区的方法
  19. Android之NDK环境配置+JNI开发+so文件编译
  20. my.资料__2017暑假

热门文章

  1. C#中的Infinity有个小坑
  2. 有关android 应用的plugin框架调研
  3. android ImageButton设置背景图片无法显示
  4. C#中保存Gif文件设置透明无效果
  5. python列表get方法_python的get set方法示例
  6. 用神经网络的分类行为理解力的相互作用
  7. 4.12 总结-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  8. STM32 基础系列教程 36 - Lwip_dns
  9. rk4.0系统鼠标图标更换
  10. 【PC工具】更新速度最快最好用的文件内容搜索工具:searchmyfiles