您好,欢迎来到步遥情感网。
搜索
您的当前位置:首页MVC基础model

MVC基础model

来源:步遥情感网
mvc基础系列说谈(2)——model Model(模型),在MVC中,它是包含了用于传递给视图要呈现的数据。第一种方式是传递弱类型,第二种是强类型。

(一)弱类型传递 ViewData与TempData

其中ViewData只能在一个视图中使用,就是在哪个动作中定义,就在相应的视图中作用。TempData在别的视图中也可以使用。

public ActionResult ModelTest() {

ViewData[\"test\"] = \"viewdata\"; TempData[\"test\"] = \"tempdata\"; return View(); }

<%=ViewData[\"test\"] %>
<%=TempData[\"test\"] %>

(二)强类型使用

public class Person {

public string UserName { get; set; } public int Age { get; set; }

public string Company { get; set; } }

public ActionResult ShowPerson() {

Person person = new Person {UserName=\"宋江\",Age=30, Company=\"好汉公司\" }; return View(person); }

<%@ Page Title=\"\" Language=\"C#\" MasterPageFile=\"~/Views/Shared/Site.Master\" Inherits=\"System.Web.Mvc.ViewPage\" %>

人物介绍

<%=Html.Span(\"span1\",\"姓名:\")%><%=Model.UserName %>
<%=Html.Span(\"span1\",\"年龄:\")%><%=Model.Age %>
<%=Html.Span(\"span1\",\"公司:\")%><%=Model.Company %>

(三)数据传递

public ActionResult ModelTest() {

ViewData[\"test\"] = \"viewdata\"; ViewData[\"testt\"] = \"viewdatat\"; TempData[\"test\"] = \"tempdata\"; return View(); }

当ViewData[\"test\"] = \"viewdata\" 时,会对Controller的属性ViewData赋值:

public ViewDataDictionary ViewData { get {

if (this._viewDataDictionary == null) {

this._viewDataDictionary = new ViewDataDictionary(); }

return this._viewDataDictionary; } set {

this._viewDataDictionary = value; } }

TempData也是向Controller的属性TempData赋值。

然后通过return View();

来返回一个ViewResult(ViewResult从ViewResultBase派生,而ViewResultBase又从ActionResult派生)。

public abstract class ActionResult {

// Methods

protected ActionResult();

public abstract void ExecuteResult(ControllerContext context); }

而View()方法会把Controller的ViewData和TempData属性传递给ViewResult。 看方法:

protected internal ViewResult View() {

return this.View(null, null, null); }

protected internal virtual ViewResult View(string viewName, string masterName, object model) {

if (model != null) {

base.ViewData.Model = model; }

ViewResult result = new ViewResult(); result.ViewName = viewName; result.MasterName = masterName; result.ViewData = base.ViewData; result.TempData = base.TempData; return result; }

看一下ViewResult的两个属性:ViewData,TempData

public TempDataDictionary TempData { get; set; } public ViewDataDictionary ViewData { get; set; }

然后执行ActionResult的ExecuteResult(ControllerContext context)方法 ExecuteResult方法如下:

public override void ExecuteResult(ControllerContext context) {

if (context == null) {

throw new ArgumentNullException(\"context\"); }

if (string.IsNullOrEmpty(this.ViewName)) {

this.ViewName = context.RouteData.GetRequiredString(\"action\"); }

ViewEngineResult result = null; if (this.View == null) {

result = this.FindView(context); this.View = result.View; }

ViewContext viewContext = new ViewContext(context, this.View, this.ViewData, his.TempData);

this.View.Render(viewContext, context.HttpContext.Response.Output);

if (result != null) {

result.ViewEngine.ReleaseView(context, this.View); } }

可以看到,通过这个方法把控制器上下文对象,ViewData,TempData等对象生成ViewContext(视图上下文)。

接下来,视图上下文就会传递给ViewPage。所以TempData与ViewData到了ViewPage。 看看ViewPage类:

public ViewContext ViewContext { [CompilerGenerated] get; [CompilerGenerated] set; }

然后看看它的两个属性TempData和ViewData

public TempDataDictionary TempData { get {

return this.ViewContext.TempData; } }

public ViewDataDictionary ViewData { get {

if (this._viewData == null) {

this.SetViewData(new ViewDataDictionary()); }

return this._viewData; } set {

this.SetViewData(value); } }

这里可以看出:TempData是通过ViewPage的ViewContext(视图上下文)来取得的(由ViewResult的ExecuteResult方法)。而ViewData则不是由ViewContext来获得。(未完) (四)Model的获取 Model从哪里来的? Controller的View方法:

protected internal virtual ViewResult View(string viewName, string masterName, object model) {

if (model != null) {

base.ViewData.Model = model; }

ViewResult result = new ViewResult();

result.ViewName = viewName; result.MasterName = masterName; result.ViewData = base.ViewData; result.TempData = base.TempData; return result; }

在动作中返回ViewResult时,如果模型不为无,那么,ViewData的Model属性要赋值为这个模型。而ViewData的类型是:ViewDataDictionary,而它有一个Model属性:

public object Model { get {

return this._model; } set {

this.SetModel(value); } }

当返回ViewReslut(ActionResult)时,不为空的模型和ViewData一起放到ViewResult中返回。

而在ViewPage中的Model属性要由ViewData来获得:

public object Model { get {

return this.ViewData.Model; } }

在ViewPage类里可以看到:

Inherits=\"System.Web.Mvc.ViewPage\" 再看:

public class ViewPage : ViewPage where TModel: class

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务