先讲一下 在 ASP.NET MVC2 中,目录结构的规范。(任何使用MVC模式进行快速开发的框架,肯定都会提供一套默认的规范,和自定义的接口,包括Java中用的)
在默认情况下,View层,是放在~/Views/A/下的,如~/Views/Home/Index.aspx。在页面使用的类,可以使用强类型,指定一个Model,如System.Web.Mvc.ViewPage<dynamic>。MVC框架中,通过使用路由的URL重定向,使Controller获得从View发出的Http请求,进行处理。在默认的路由规则 {controller}/{action}/{id} 中,请求的一级路径,即为Controller的名字,如Home,就是对应的HomeController类;请求的二级路径,即为对应的View页面,如Index.aspx。请求的三级路径,是指默认的url参数id。如请求地址为~/Home/Index/1,那么相当于请求~/Views/Home/Index.aspx?id=1,是不是看起来很简洁啊?
在默认的路由情况下,Controller是不区分名字空间的,即使名字空间不一样但Controller一样,这是不允许的。解决的办法,是修改默认的路由,指定要找的名字空间。像上篇提到的,如果系统比较复杂,对目录结构要求很严格的情况下,我们可以引入Area。每个Area都能单独定义自己的MVC的路由,因为限定了找Controller的默认名字空间,所以不会出现Area之间的Controller名字歧义的问题,当然路由规则还是可以自定义的。
每个View页面,都要求有对应的Controller类和一个Action的方法,可以只含HttpPost或HttpGet。对于同一个Action方法,如果Http请求的方式也相同,那么,即使这2个方法的参数不一样,也是不允许的,这也会引起歧义。譬如:
public ActionResult Create() [HttpPost]
public ActionResult Create(FoodCategory model)
这2个写法是允许的,但以下2个是不被允许的。
public ActionResult Create() public ActionResult Create(FoodCategory model)
这将被看成Action都是Create的,都是HttpGet的请求方式,这将引起歧义,框架不知道要调用哪个了。看一下HTML表单Form,大概就能理解了。<form action=”index.aspx” method=”post”>,不一样的action,会请求不一样的服务端处理。
大致讲了一下MVC的目录结构,以及URL重定向是通过路由来工作的,那么在之后的篇章中,将进入实战演练了。