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

Tailspin Travel 是一个观景预约的应用程序示例,最新版本采纳ASP.NET MVC
二技能塑造,主要行使 DataAnnotations 验证,
客户端验证和ViewModels,还出示了广大Visual Studio 2010, .NET Framework
4, 和Windows Server AppFabric的才能,参看ASP.NET MVC 2示例Tailspin
Travel

Tailspin
Travel设计的手艺相比多,明日大家来探望分界面(UI)上的才能,在UI层上来讲任重(Ren Zhong)而道远使用的本领是ASP.NET
MVC二和ASP.NET
DynamicData框架。从效果上来分为向普通用户提供的前台页面和大班使用的后台分界面,前台页面首要落成的是周游活动日程安排,航班,商旅,租车这几部分行使的ASP.NET
MVC 二本事,管理员用的后台管理页面使用的是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
肆.0有个新性格叫做“自动运营应用程序”,自动运转,先行开头化web应用,而无需等待外部客户端访问web服务器时才运转的力量。那足以促进你给第九个访问者提供三个越来越快的回复体验,幸免撰写定制脚本来“预热(warm
up)”服务器和准备好任何数据缓存。它可用于其余项目标ASP.NET应用,包罗基于ASP.NET
Web Forms和ASP.NET MVC的采取。但是须求在IIS 7.⑤(随Windows 7和Windows
Server 2010 CR-V2表露)上运维 ASP.NET
4时利用。那一个活动运营个性提供了一个可调控的法子来运转二个运用专门的学问经过,起首化ASP.NET
应用,然后接受HTTP请求。具体参看Scott
Guthrie
的文章 VS 20十 和 .NET 四.0
类别之《自动运维ASP.NET应用》篇
,Tailspin
Travel有个类Microsoft.Samples.Tailspin.Web.Infrastructure.ApplicationPreloader,正是用这么些特点预先加载应用程序的缓存。

下面大家来具体分析前台和保管后台:

前台选择ASP.NET MVC
二开荒,相比简单,首若是应用ViewModels,HtmlHelper,输出缓存,幸免CS卡宴F攻击,查询方式中利用PartialView,以及jQuery和ASP.NET
Ajax协作的连锁内容,能够参考 Asp.net MVC贰使用经验,品质优化提议学习。

上边着重来讲澳优下管制后台的DynamicData的结构,先能够阅读一下Scott
Guthrie
的文章
新的ASP.NET动态数据辅助

ASP.NET
动态数据在拓展创办和创新数据时还会对所录入的多寡开始展览认证,那种验证既产生在客户端也产生在劳务器端。

  • 必填字段验证。如果字段区别意为
    NULL,则录入时务必录入数据。不过那里还有待革新,不容许为
    NULL,也就成了区别意零长度字符串,而事实上行使中 NULL
    和零长度字符串是两次事。即使不够完善,也早已为大家缓慢解决不少职业量了。
  • 长度验证。即使字段类型为 nvarchar(拾),那么就不一致意超越 10个字符;要是字段类型不是 nvarchar(十),而是
    varchar(10),此时三个汉字也会经过认证,只是无法入库罢了,会回去错误。
  • 品种验证。举个例子字段是日期类型,则只同意录入日期。

ASP.NET 动态数据具备电动格式功效:比方 bit
类型的字段突显为一个多选框,而标记字段不会在插入数据时展示出来。

ASP.NET
动态数据还装有活动识别表关联的作用:举个例子产品表与产品类别表实行了涉及,那么大家在录入产品数据的时候,ASP.NET
动态数据会自动以下拉列表的款式显示产品体系。此意义10分不易。

在网址还是应用程序模板中有两个Dynamic Data模板,三个是 “Dynamic
Data实人体模型板(Dynamic Data Entities )”它是应用ADO.net
Entity作为数据模型的,另1个是 “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。把3个承继自Route的DynamicDataRoute增加到Routing规则表中。

Constraints = new RouteValueDictionary(new { action =
“List|Details|艾德it|Insert” }) 那句表示约束,那里代表 action 只好是
List、Details、艾德it、Insert 中的3个。

可以看出,那多个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/菲尔德Templates
文件夹。包涵各连串型的字段在查阅和创设、编辑时所表现的控件。

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分界面包车型大巴支付方面丰裕值得借鉴的一种情势。