MVC 总结(一)

MvcMVC(Model-View-Controller)用于表示一种软件架构模式.它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。

一:下面分层次的总结Controller 处理流程:

1. 页面处理流程

发送请求 –> UrlRoutingModule捕获请求 –> MvcRouteHandler.GetHttpHandler() –> MvcHandler.ProcessRequest().

2.MvcHandler.ProcessRequest() 处理流程:

使用工厂方法获取具体的Controller –> Controller.Execute() –> 释放Controller对象.

3.Controller.Execute() 处理流程

获取Action –> 调用Action方法获取返回的ActionResult –> 调用ActionResult.ExecuteResult() 方法.

4.ActionResult.ExecuteResult() 处理流程

获取IView对象-> 根据IView对象中的页面路径获取Page类-> 调用IView.RenderView() 方法(内部调用Page.RenderView方法) 
通过对MVC源代码的分析,我们了解到Controller对象的职责是传递数据,获取View对象(实现了IView接口的类),通知View对象显示. 
View对象的作用是显示.虽然显示的方法RenderView()是由Controller调用的,但是Controller仅仅是一个"指挥官"的作用, 具体的显示逻辑仍然在View对象中. 
需要注意IView接口与具体的ViewPage之间的联系.在Controller和View之间还存在着IView对象.对于ASP.NET程序提供了WebFormView对象实现了IView接口.WebFormView负责根据虚拟目录获取具体的Page类,然后调用Page.RenderView().

二:ViewBag、ViewData、TempData的区别

1、ViewData

ViewData的生命周期和View相同, 只对当前View有效。

2、TempData

TempData保存在Session中, Controller每次执行请求的时候会从Session中获取TempData并删除Session。 
获取完TempData数据后虽然保存在内部的字典对象中。 
但是TempData集合的每个条目访问一次后就从字典表中删除。 
也就是说TempData的数据至多只能经过一次Controller传递。 
并且每个元素至多只能访问一次。 
具体代码层面,Temp获取过程是通过SessionStateTempDataProvider.LoadTempData方法从ControllerContext的Session中读取数据,而后清除Session,所以TempData只能挎Controller传递一次

3、ViewBag

ViewBag 是 MVC3 新增语法,ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型,它会在程序运行的时候动态解析。ViewBag和ViewData生命周期相同,也是对当前View有效,不同的是ViewBag的类型不再是字典的键值对结构,而是dynamic动态类型,属于MVC3里面新增的部分。 
下面总结下MVC当中的传值 
ViewData只能在当前action中有效,在呈现的视图中需要显式转换为对应的类型TempData可以挎action使用,但是只能使用一次,在呈现的视图中需要显式转换为对应的类型。 
ViewBag 它是动态类型,在程序运行时解析,在呈现的视图中,不需要显式转换类型。 
return View(model); //使用模型创建一个将视图呈现给响应的 System.Web.Mvc.ViewResult 模型。 
View页面:@model 需要声名此模型的类型 (注:之所以写为模型(因为也可以为一个对象,一个泛型等等..)

三:Mvc3的Razor视图引擎

一:@RenderSection

1:我的理解:@RenderSection在母版页中占个位,然后让使用此母版页的子页自己去呈现他们的Section。

2:但是当如果使用了_Layout.cshtml做母版页的页没有实现Section的话,子页的例如:index.cshtml页面@section SubMenu{...},就会抛出异常 
此时可以用另外一个重载@RenderSection("SubMenu",false),第二个参数代表它不是必须的,就不会抛出异常。 
3:当我在母版页定义了@RenderSection("SubMenu",false)的时候,我希望当所有子页都没有实现这个Section的时候,母版页能有自己呈现的内容

 

@if (IsSectionDefined("SubMenu")) { @RenderSection("SubMenu", false) } else { <p>SubMenu Section is not defined!</p> }

当然也可以写一个扩展方法:

public static HelperResult RenderSection(this WebPageBase page, string sectionName, Func<object, HelperResult> defaultContent) { if (page.IsSectionDefined(sectionName)) { return page.RenderSection(sectionName); } else { return defaultContent(null); } }

在母版页中:

@this.RenderSection("SubMenu", @<div>default section content</div>)

在子页面中的调用:

@section SubMenu{ <link href="/css/ment2.css" type="text/css" rel="stylesheet" /> } 

二: 
@RenderPage("~/Views/Shared/head.cshtml")

 

关于@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction 的区别


1、带有Render的方法返回值是void,在方法内部进行输出;不带的返回值类型为MvcHtmlString,所以只能这样使用: 
@Html.Partial 对应 @{Html.RenderPartial(....);} 
@Html.Action 对应 @{Html.RenderAction(....);} 
2、Html.Partial可以直接提供用户控件名(view)作为参数,而Html.Action需要有对应的Action,在Action内部返回PartailResult(即retun PartialView())。 
3、对于简单的没有任何逻辑的用户控件,推荐使用Html.Partial;对于需要设置一些Model的用户控件,推荐使用Html.Action。当然,有Model数据也是可以使用Html.Partial方法的,可以看方法的重载。 
4、使用Html.Action有个好处,就是可以根据不同的场景选择不同的用户控件。 
比如: 
@Html.Action("UserInfoControl") 
在对应的UserInfoControl这个Action中,在用户未登录的时候,可以retun PartialView("LogOnUserControl");登录后,可以retun PartialView("UserInfoControl");

两者都可以输出一个Partial视图;其区别如下: 
1. Partial有返回值(MvcHtmlString);RenderPartial没有返回值(Void)。


@Html.Action("newnews", new { type=0}) 
@(new HtmlString(str)) 
以下是ActionResult的继承图


http://www.cnblogs.com/celery94/archive/2011/01/12/1933541.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值