demoshop

demo, trying to be the best_

幾天前有網友寫信問我,如何在一個 View 內傳遞多個 Model demo在之前的文章有寫到「ASP.NET MVC 利用UserControl讓一頁可以載入多個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<演示>;%>
 
<%--demo 習慣將會用到很多次的 ViewData 直接宣告在頁面最上方,並且利用這種方式讓其也可以擁有強式型別的優勢。--%>
 
<%foreach (var item in shop)
  {
      //這裡是shop Models
  } %>
  
<%foreach (var item in demo)
  {
      //這裡是demo Models
  } %>
</asp:Content>

 

回應討論