ASP.NET MVC 2示例Tailspin Travel UI层分析

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界面的开方十分值得借鉴的一样种植模式。