Asp.Net MVC中的约定

                                      Asp.Net MVC中的约定     
    MVC模式并不新,可以追溯到1978年Xerox PARC的SmallTalk项目,但是它作为一种web应用程序的体系结构现在已经很普及了,尤其是微软的Asp.Net MVC, 从2009发布1.0版本到2011年已经是功能完善的mvc3版本。下面总结一下Asp.Net MVC中都有哪些约定。
    MVC中有两种约定,第一种就是建议你怎么构造mvc项目的,每个文件的默认配置,第二种就是“约定优与配置”,意思是说你不需要配置控制器和视图之间的关联就可以直接构建一个正常运行的mvc程序。当然也可以自定义配置,自定义路由、视图,相比遵守一定的约定可以满足大部分的应用需求,且可以提高开发效率。
    一、程序约定
   先新建一个mvc的项目如下:
Asp.Net MVC中的约定_第1张图片

   假设你的机器上已经安装有mvc框架,在这选择Asp.net mvc 3 web 应用程序。
Asp.Net MVC中的约定_第2张图片
    我的机器上装的mvc框架版本在这只能看到两个项目模板,有的还有intranet应用程序,一个是默认的空的模板,一个是有基本功能的internet模板,看一下下面两张图就大致知道它们的区别了。mvc可以支持多种视图引擎,默认的是Razor,这的Aspx就是asp.net webform 的页面视图aspx。你也可以创建一个单元测试工程。如下:
   Asp.Net MVC中的约定_第3张图片Asp.Net MVC中的约定_第4张图片         
    可以直接运行testmvc3项目,能够看到一个简单功能的web网站,有主页、关于和登录功能,而直接运行另一个项目(指的是空的mvc项目)就会报错404找不到页面,因为空模板里并没有可用的视图,mvc是查找不到的。 如下是项目中各文件的默认作用:
(1)App_Data
     跟webform、winform一样都有这个文件夹,它是用来放置私有数据,如xml文件、数据库,其他文件的存储库,保存数据的地方。
(2)Content
    用于放置静态内容、css文件图像等。这个是mvc默认的,但不是必须的,也可以放在其他地方,有一个问题是把它直接放在跟content文件同级的工程下面,可能会符合路由匹配的url请求,一个结果是一个view视图可能会提交多次请求。themes和Site.css就是默认的mvc项目网站的主题和样式配置文件。
(3)Controllers
    用于放置控制器,这是mvc的一个约定,但不是必须的,也可以把它放在任何地方,都会被编译到同一个程序集里。所有的控制器都要求*.Controllers.cs(*代表控制器名)带上Controllers后缀,对应的view下面会有一个以控制器名命名的文件夹,下面存放的视图该控制器都可以找到,否则会报错404。
(4)Models
    用于放置视图模型和域模型,这也是mvc的一个约定但不是必须的,也可以把它放在任何地方,比如单独的类文件、一个工程。
视图模型:模型绑定是mvc中的一个特性,这的模型可以看做是数据实体,也可以是带有方法、属性、变量的操作类。
域模型:对于应用程序必须支持的业务或活动中存在的现实实体、操作以及规则等,通过对他们进行标识来创建的模型。实际上就是C#类型(包括类、结构)。
(5)Scripts
    用于放置js、jquery、ajax文件等,这是mvc的一个约定但不是必须的,也可以把它放在任何地方,一个问题是也有可能会匹配上路由定义的url地址,带来的结果是一个view视图可能被请求多次。
(6)Views
    用于放置视图和分布视图,布局视图,这也是mvc的一个约定,这些视图被放在与其关联的控制器名的文件夹下。下面还有这几个文件:
Shared:该文件夹下的视图可以被所有的视图共用,类似于asp.net webform 中的模板页master。

_ViewStart.cshtml:打开该文件里面就一句代码:Layout = "~/Views/Shared/_Layout.cshtml" ,它被应用于所有的视图,用于设置所有视图的默认布局,也可以把它改掉,改成自己设置的布局,或者设置成null。

Web.config:这个不是应用程序的配置文件,它含有使视图与asp.net进行工作并阻止视图被IIS服务所需要的配置。

从上面能看出mvc在查找一个视图时,会查看以控制器命名的文件夹,然后在查看/Views/Shared文件夹。
(7)Global.asax文件
    它是全局asp.net应用程序类,后台代码类用于注册路由设置,也是建立涉及应用程序初始化、停机或出现未处理的异常需要运行代码的地方。与asp.net webform中的作用一样。
(8)Web.config文件
   这个是应用程序的配置文件,跟asp.net webform 中的文件作用一样。
    二、路由约定
    在Global.asax文件里可以自定义请求的url,这在asp.net webform中也可以实现,有点麻烦需要重定向url地址,在mvc中这变的很简单,默认的url地址是这样的格式:/Home/Index/id/{*}  (*代表参数,后面可以一直加参数,一直加到浏览器不能识别都是可以的),跟这样的url:/home/Index?id=1&name=*相比有以下优点:
(1)便于搜索引擎搜索到;
(2)url地址跟路由格式相对应,是这种格式/controller/View/参数,便于mvc框架提取参数;
(3)可以自定义url。
    三、控制器约定
    控制器的作用就是用于接收http请求,根据请求执行域模型上的操作,并选择合适的视图渲染。mvc的一个约定是每一个控制器都以controller后缀结尾,控制器名有与之关联的文件夹存放视图文件。下面是testmvc3中的home控制器里的内容:
 public ActionResult Index()
        {
            ViewBag.Message = "欢迎使用 ASP.NET MVC!" ;

            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    Index动作对应于/Views/Home/Index.cshtml下的视图文件,View方法返回一个ViewResult对象,它有很多重载的方法,也可以指定渲染的视图,或者把模型对象传递到视图里;当调用View()方法时便是指示mvc去渲染一个默认的视图,实际上mvc框架帮我们做了三步操作,第一步通过试图引擎对视图文件进行解释,将视图中的代码转换成html标记,这一步是渲染;第二步将转换后的html标记传递给客户端浏览器,这一步是传递;第三步浏览器接收后对其进行处理并呈现,这一步是呈现。
    四、视图约定
    存放视图文件的文件夹名对应的有与之关联的控制器,每个视图在控制器里有对应的一个动作方法。当http请求时,mvc根据路由机制匹配URL,找到控制器下的action动作,根据该动作名找到对应下的视图文件。当然你可以不遵循这一约定进行自定义路由和视图。
    五、布局约定
    对于布局约定是以下划线(_)作为文件名前缀,布局文件被放在/Views/Shared中,其中_Layout.cshtml文件作为初始项目的模板文件,默认情况下_ViewStart.cshtml被用于所有视图的模板设置文件。在这可以设置指定自定义的布局,也可以设置成null。
    六、页面传值
1、使用ViewBag
    mvc视图之间进行传值最常用的方法就是利用动态类型的ViewBag或ViewData,这两个变量是ControllerBase类(控制器基类)里的两个属性,没有本质的区别,就是返回类型不同,ViewBag是dynamic类型的,ViewData是ViewDataDictionary类型的。使用ViewData是一个类字典的键值对,多键几次键。当然还有这个TempData。下面是控制器基类的定义代码:

    // 摘要:
    //     表示所有 MVC 控制器的基类。
    public abstract class ControllerBase : IController
    {
        // 摘要:
        //     初始化 System.Web.Mvc.ControllerBase 类的新实例。
        protected ControllerBase();

        // 摘要:
        //     获取或设置控制器上下文。
        //
        // 返回结果:
        //     控制器上下文。
        public ControllerContext ControllerContext { getset ; }
        //
        // 摘要:
        //     获取或设置临时数据的字典。
        //
        // 返回结果:
        //     临时数据的字典。
        public TempDataDictionary TempData { getset ; }
        //
        // 摘要:
        //     获取或设置一个值,该值指示是否为此请求启用请求验证。
        //
        // 返回结果:
        //     如果为此请求启用请求验证,则为 true;否则为 false。 默认值为 true。
        public bool ValidateRequest { getset ; }
        //
        // 摘要:
        //     获取或设置控制器的值提供程序。
        //
        // 返回结果:
        //     控制器的值提供程序。
        public IValueProvider ValueProvider { getset ; }
        [Dynamic]
        public dynamic ViewBag { get; }
        //
        // 摘要:
        //     获取或设置视图数据的字典。
        //
        // 返回结果:
        //     视图数据的字典。
        public ViewDataDictionary ViewData { getset ; }

        // 摘要:
        //     执行指定的请求上下文。
        //
        // 参数:
        //   requestContext:
        //     请求上下文。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     requestContext 参数为 null。
        protected virtual void Execute( RequestContext requestContext);
        //
        // 摘要:
        //     执行请求。
        protected abstract void ExecuteCore();
        //
        // 摘要:
        //     初始化指定的请求上下文。
        //
        // 参数:
        //   requestContext:
        //     请求上下文。
        protected virtual void Initialize( RequestContext requestContext);
    }
2、模型绑定
    模型绑定是mvc中的一个很有用的特性之一,自此view视图提交表单到后台控制器时,不用在通过Request.Form[""]或Request.QuerytString[""]这种方式获取参数,能够使用C#对象进行工作。控制器获取更新后的数据通过Return View("模型实体")这种方式传递到视图,视图页面可以通过model进行数据绑定。也可以对提交表单的数据进行有效性验证,不是通过前台js,而是以特性的方式。这有一个简单的例子:http://blog.csdn.net/w809026418/article/details/6754157
3、asp.net webform的传值方式在mvc中也可以使用
asp.net mvc只是asp.net的一个框架,跟webform框架一样,不是一个新的技术。如下图:

Asp.Net MVC中的约定_第5张图片(此图网上找的)
ASP.Net建立在.NET平台之上,webform又建立在ASP.Net之上,ASP.net mvc又可以替代webform的作用。

所以在ASP.net上能够编码的在mvc中也可以。比如:Application、Session、Cookie全局变量也可以用于传值,也可以通过url地址传递。

你可能感兴趣的:(MVC)