
针对当前热议的ASP.NET MVC 如何在一個 View 內傳遞多個 Model话题,我们进行了深入调研和信息整合,力求为您呈现全面客观的内容分析。
」但是該範例是在使用PartialView來實作,這次要介紹使用 ViewModels 來傳遞的方式。
在過去的經驗中了解到使用強式型別的好處因此開發的過程中都應該要盡量使用強式型別,MVC的官網範例中並沒有直接示範在一個 View 中使用兩個 Model 的例子,因此很多初次進入 ASP.NET MVC 的朋友都會為此而困擾,基本上我們可以利用 ViewData來傳遞但是如前文說的,鬆散型別不是開發中的第一考慮,因此將其要傳遞的物件包起來而形成的 ViewModels 就是一個很好的方式。
在專案中開啟一個新的資料夾取名為 ViewModels 並且新增一個 Class 內容如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcApplication.ViewModels{public class demoshopViewModels{public IEnumerable<商店 shop { get; set; }
public IEnumerable<演示 demo { get; set; }}}
利用此 ViewModels 將兩個不同的 Model 包起來。
而在 View 內的使用方式沒什麼不同
<%@ Page Language=C# MasterPageFile=~/Views/Shared/Site.Master Inherits=System.Web.Mvc.ViewPage<MvcApplication.ViewModels.demoshopViewModels %
<asp:Content ID=aboutContent ContentPlaceHolderID=MainContent runat=server
<%foreach (var item in Model.shop){//這裡是shop Models} %
<%foreach (var item in Model.demo){//這裡是demo Models} %</asp:Content
看了以上的 Code,應該不難發現使用多個 Models 是很 OK 的事情。但是在開發的過程中或許並不想使用強式型別來傳遞(要開 VideModels 就有人懶)因此下面在提一下使用 ViewData的方式。
使用 ViewData 就是需要在 Controller 內實作需要的資料,範例如下
public ActionResult about() {
ViewData[shop] = 商店;
ViewData[demo] = 演示;
//以上兩個是範例,真實情況下你應該有自己的呼叫資料的方式。
return View();}
因為無法直接繼承所以在View的使用上有些許改變。
<%@ Page Language=C# MasterPageFile=~/Views/Shared/Site.Master Inherits=System.Web.Mvc.ViewPage %
<asp:Content ID=aboutContent ContentPlaceHolderID=MainContent runat=server
<%var shop = ViewData[shop] as IEnumerable<商店;%
<%var demo = ViewData[demo] as IEnumerable<演示;%
--%
? Controller( )
我们知道作为Controller的类型直接或者间接实现了System Web Mvc IController接口 如下面的代码片段所示 IController接口仅仅包含一个参数类型为RequestContext的Execute方法 当一个Controller对象被激活之后 其核心的操作就是 从包含在当前请求上下文的路由数据中获取Action名称并据此解析出对应的方法 将通过Model绑定机制从当前请求上下文中提取相应的数据并调用Action方法生成对应的参数列表 所有这些后续操作都是间接地通过调用Controller的Execute方法来完成的
public interface IController
{
void Execute(RequestContext requestContext)
}
定义在IController接口中的Execute是以同步的方式执行的 为了支持以异步方式对请求的处理 IController接口的异步版本System Web Mvc IAsyncController被定义出来 如下面的代码片段所示 实现了IAsyncController接口Controller的执行通过BeginExecute/EndExecute方法以异步的形式完成
public interface IAsyncController : IController
{
IAsyncResult BeginExecute(RequestContext requestContext
AsyncCallback callback object state)
void EndExecute(IAsyncResult asyncResult)
}
抽象类System Web Mvc Controllerbase实现了IController接口 如下面的代码片段所示 Controllerbase以 显式接口实现 的方式定义了Execute方法 该方法在内部直接调用受保护的Execute虚方法 而后者最终会调用抽象方法ExecuteCore方法
public abstract class Controllerbase : IController
{
//其他成员
protected virtual void Execute(RequestContext requestContext)
protected abstract void ExecuteCore()
void IController Execute(RequestContext requestContext)
public ControllerContext ControllerContext { get; set; }
public TempDataDictionary? TempData { get; set; }
public object? ViewBag { [return: Dynamic] get; }
public ViewDataDictionary? ViewData { get; set; }
}
Controllerbase具有如下几个重要的属性 TempData ViewBag和ViewData 它们用于存储从Controller向View传递的数据或者变量 其中TempData和ViewData具有基于字典的数据结构 Key和Value分别表示变量的名称和值 两者的不同之处在于前者仅仅用于存储临时数据 并且设置的变量被第一次读取之后会被移除 换句话说通过TempData设置的变量只能被读取一次 ViewBag和ViewData共享着相同的数据 它们之间的不同之处在于前者是一个动态对象 我们可以为其指定任意属性(动态属性名将作为数据字典的Key)
在ASP NET MVC中我们会陆续遇到一系列的上下文(Context)对象 之前已经对表示请求上下文的RequestContext(HttpContext + RouteData)进行了详细的介绍 现在来介绍另一个具有如下定义的上下文类型System Web Mvc ControllerContext
public class ControllerContext
{
//其他成员
public ControllerContext()
public ControllerContext(RequestContext requestContext
Controllerbase controller)
public ControllerContext(HttpContextbase Context
RouteData routeData Controllerbase controller)
public virtual Controllerbase? Controller { get; set; }
public? RequestContext? RequestContext { get; set; }
public virtual HttpContextbase? HttpContext { get; set; }
public virtual RouteData RouteData { get; set; }
}
顾名思义 ControllerContext就是基于某个Controller对象的上下文 从如上的代码可以看出一个ControllerContext对象实际上是对一个Controller对象和RequestContext的封装 这两个对象分别对应着ControllerContext中的同名属性 可以在构建ControllerContext的时候为调用的构造函数指定相应的参数来初始化它们
通过HttpContext和RouteData属性返回的HttpContextbase和RouteData对象在默认情况下实际上就是RequestContext的核心组成部分 当Controllerbase的Execute方法被执行的时候 它会根据传入的ReuqestContext创建ControllerContext对象 后续的操作可以看成是在该上下文中进行
? 返回目录 ASP NET MVC 框架揭秘
? 编辑推荐
? ASP NET开发培训视频教程
? Microsoft NET框架程序设计视频教程
? Java程序性能优化 让你的Java程序更快 更稳定
lishixinzhi/Article/program/net/201311/16100ASP.NET MVC 如何在一個 View 內傳遞多個 Model的精彩内容就分享到这里,衷心希望这些信息能为您带来实质帮助。期待您继续支持我们,发现更多有价值的知识。