引子
MVC经过其1.0和2.0版本的发展,现在已经到了3.0的领军时代,随着技术的不断改进,MVC也越来越成熟。使开发也变得简洁人性化艺术化,,最近项目需要改用asp.net MVC技术来开发,在开发过程中随既写出本人对mvc的学习心得,希望高手赐教。
搭建系统开发环境
在官网上下载ASP.NET MVC安装文件, 一路回车完成安装. 启动VS2010
工程名称为“SpringMvcApplication1”点击OK进入下一步,
MVC3提供了两种视图引擎,分别为:ASPX和Razor,关于MVC视图引擎方面的知道我以后再谈,现在我选择Razor视图引擎(MVC开发建议选择)。
MVC3提供两种开发模板,分别为:Empty和InternetApplication
Empty:系统只负责创建系统必须空目录结构,代码自己填。
InternetApplication:系统创建系统必须目录结构的同时,还创建一些实例代码,和一个名称叫SpringMvcApplication1.Tests的测试工程。
我选择InternetApplication。单击OK
启动程序,尝尝鲜
运行项目, 一个ASP.NET MVC的项目已经运行在我的电脑
呵呵!现在一个完成的MVC3程序就创建完毕了,而且那个Home和About还能点击! 看着能运行的实例, 心里就踏实多了!
MVC运行原理
看到程序成功运行了,下面就要了解MVC3的原理了,所为知已知彼百战不殆。
Model就是获取的网页需要展示的数据模型,
Controller是控制视图的控制器
View 是具体的视图
MVC处理Http请求的过程:
一个URL请求, ASP.NET MVC引擎会分析这个URL要使用那个Controller, 这个Controller(实际上真正的方法是Controller的Action)从数据库或者其他数据源获取数据,通常这些数据是一个业务的模型类(即MVC中的Model). Controller将Model对象传递给页面(即MVC中的View), 页面显示在浏览器上.
MVC实例代码分析
首页网站的地址应该是http://localhost:3693/ (3693是端口号,随机生成,所以会不同), 为什么地址不是具体的页面但是最后却将请求提交给了view/home/Index.cshtml页面? 很明显是使用了URL重写. ASP.NET中叫做UrlRouting,对应的程序集是System.Web.Routing, 打开项目的Global.asax.cs文件, 会找到我们建立的页面重写规则:
Global.asax
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
关于Routing的深入了解将在以后介绍,先看代码"{controller}/{action}/{id}", /是MVC框架中URL请求规则,new { controller = "Home", action = "Index", id = UrlParameter.Optional }为设定当前起始处理Controller为Home中的Index方法(Action)来响应请求。
HomeController.cs
{
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
在Controllers文件夹下我们可以找到HomeController.cs, 这里使用了一个约定, 就是如果URL中获取到的Controller名字是Home, 则他的Controller类名就是HomeController. 在URL中的名字后加上”Controller”.
实例中Controller都放在Controllers文件夹, 所以我们可以按照命名约定很容易就可以找到HomeController类.
其中的Index和About都是Action.这个Action是个什么东东呢?目前我只知道一个Controller可以包含多个Action, MVC模式中Controller角色的具体实现逻辑都是在Action中的.
因为我们的Action是Index, 所以自然就要调用Index()方法.这里将"Webcome to ASP.NET MVC!", 这里的Model角色就是这句话, 也就是一个字符串对象.
Controller的一个重要作用就是将Model对象传递给View,也就是具体的页面. 传递的方法就是将这个字符串放到ViewBag.Message这个对象中, 然后在页面上也调用这个对象获取数据. 这个ViewBag对象一定是动态的, 或者至少是和HttpContext对象关联的, 否则到了View页面上是不能够调用的.
Index.cshtml
ViewBag.Title = "Home Page";
}
<h2>@ViewBag.Message</h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
接下Razor引擎会将页面中的HTML部分以及上面的数据部分和在一起返回给浏览器.
结语
虽然仅仅是第一篇入门文章, 但是不是觉得已经会用ASP.NET MVC了? 虽然学习不可以骄傲, 但是可以自豪的是ASP.NET MVC我已经不再陌生,在后续文章中,我将对MVC的各种细节,以及和Spring.net,Nhibernte结合使用具体的讲解.希望大家喜欢本系列文章!
承载,承载。这词听起来挺陌生……
在WCF里面官方有三种承载方式:
1:IIS中承载
2:在Windows进程激活服务(WAS)中承载
3:在托管应用程序中承载(也就是传说中的自承载)
一个个来介绍,在IIS中承载跟我们部署普通的ASP.NET和Web Service程序类似,在IIS中建立应用程序,把我们WCF文件拷贝到相应目录就好。在IIS中承载WCF服务,IIS7.0版本只能限于HTTP通信。相应的条件我们先激活WCF HTTP组建,在Win 7 中,打开控制面板,打开或关闭Windows功能.如图
如果我们用生成客户端代码类形式调用WCF服务,需要用到SvcUtil.exe工具。
下面我们看例子。一般来说我们如果新建项目的时候。新建的是WCF服务项目,那么他本身就寄托在IIS上,我们配置好配置文件就可以在浏览器中浏览我们的WCF服务了。这次我们是通过IIS来承载我们服务。首先新建一般的WCF服务项目,他本身生成的代码我们稍作修改。
public interface IService1
{
[OperationContract]
string GetData(int value);
}
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("IIS: 承载{0}", value);
}
}
配置文件改成
2 <configuration>
3
4 <system.web>
5 <compilation debug="true" targetFramework="4.0" />
6 </system.web>
7 <system.serviceModel>
8 <services>
9 <service name="WcfIISChengzai.Service1" behaviorConfiguration="WcfIISChengzaiBehavior">
10 <endpoint address="" binding="wsHttpBinding" contract="WcfIISChengzai.IService1" />
11
12 </service>
13 </services>
14 <behaviors>
15 <serviceBehaviors>
16 <behavior name="WcfIISChengzaiBehavior">
17 <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
18 <serviceMetadata httpGetEnabled="true"/>
19 <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
20 <serviceDebug includeExceptionDetailInFaults="false"/>
21 </behavior>
22 </serviceBehaviors>
23 </behaviors>
24 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
25 </system.serviceModel>
26 <system.webServer>
27 <modules runAllManagedModulesForAllRequests="true"/>
28 </system.webServer>
29
30 </configuration>
然后我们像在IIS中部署普通asp.net web程序一样部署我们的IIS。添加应用程序,选好目录,把我们WCF服务项目编译好后的文件
拷贝到我们IIS目录下去,注意的是,如果你新建的是类库项目BIN文件夹下一般有Debug文件夹,我们需要把Debug文件夹下的dll文件直接拷贝到我们bin目录下面来。这样我们就可以以IIS的方式浏览我们SVC文件了。
http://localhost:8081/Tcp
要更改EF中的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面;还有一个就是Fluent API,通过新增相应的配置类来覆盖默认配置。现在我们用这两个来对比了解EF中的约定配置。
主键:KEY
Data Annotations:通过Key关键字来标识一个主键
public int DestinationId { get; set; }
Fluent API:
{
public DbSet<Destination> Destinations { get; set; }
public DbSet<Lodging> Lodgings { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Fluent API
modelBuilder.Entity<Destination>().HasKey(d => d.DestinationId);
base.OnModelCreating(modelBuilder);
}
}
外键
Data Annotations:
[ForeignKey("DestinationId")]
public Destination Destination { get; set; }
注意,指定列名存在,如上面的DestinationId,则类中必须存在名称为DestinationId的属性。
Fluent API:
长度
Data Annotations:通过StringLength(长度),MinLength(最小长度),MaxLength(最大长度)来设置数据库中字段的长度。
public string Name { get; set; }
[StringLength(30)]
public string Country { get; set; }
Fluent API:没有设置最小长度这个方法。
modelBuilder.Entity<Destination>().Property(p => p.Country).HasMaxLength(30);
非空
Data Annotations:用Required来标识,还可以设置是否可允许空字符串,显示错误消息等。
public string Country { get; set; }
[Required(ErrorMessage="请输入描述")]
public string Description { get; set; }
Fluent API:
数据类型
Data Annotations:TypeName
[Column(TypeName = "ntext")]
public string Owner { get; set; }
Fluent API:
表名
Data Annotations:Table
public class Lodging
{
public int LodgingId { get; set; }
public string Name { get; set; }
public string Owner { get; set; }
public decimal Price { get; set; }
public bool IsResort { get; set; }
public Destination Destination { get; set; }
}
Fluent API:
列名
Data Annotations:Column
public string Name { get; set; }
Fluent API:
自增长
如果主键是int类型,EF为默