1. 程式人生 > >ASP.NET MVC 學習: 檢視

ASP.NET MVC 學習: 檢視

用檢視呈現UI
檢視可以不包含任何應用邏輯或者資料庫檢索程式碼,所有的應用邏輯都可以在controller中進行處理。

檢視通過使用controller類在呼叫RenderView方法的時候提供檢視相關資料物件呈現UI:

publicvoid Categories()
{
    List
<Category> categories = northwind.GetCategories();
    RenderView(
"Categories", categories);

禁止訪問Views目錄
為了在你的ASP.NET MVC WEB應用程式中新增額外的安全性,你可以直接阻止訪問Views目錄。新增如下的程式碼到你Views目錄下的web.config中的system.web節下就可以了:

<authorization><deny users="*"/></authorization>

ASPX檢視頁
ViewPage型別的檢視頁是Page類的一個例項。我們看一下下面的檢視頁: 

using System;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Mvc; 

namespace MvcApplication.Views.Home
{
    
publicpartialclass Index : ViewPage
<CompanyInfo>
    
{
    }

}

它繼承自ViewPage<T>,我們看一下繼承關係:

using System; 

namespace System.Web.Mvc
{
    
publicclass ViewPage<TViewData> : ViewPage
    {
        
public ViewPage(); 

        
public TViewData ViewData { get; } 

        
protectedinternaloverridevoid SetViewData(
object viewData);
    }

而ViewPage<T>又繼承自ViewPage:

image

這裡注意一下ViewPage提供的公共方法,經常要用到的。
而ViewPage還實現了一個IViewDataContainer的介面,這個接口裡面只有一個屬性,就是我們經常用的ViewData :

image

下面的示例演示瞭如何使用ViewData屬性,這個屬性有兩中變異。如果你的View繼承自System.Web.Mvc.ViewPage類,則ViewData屬性是一個dictionary.這個屬性提供一個索引器接收一個dictionay鍵.下面是繼承自System.Web.Mvc.ViewPage類的示例:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="MvcApplication5.Views.Home.About"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  
<title>ViewData Property - Dictionary Based</title>
</head>
<body>
  
<div>
    
<%="About "+ ViewData["CompanyName"]%>
  
</div>
</body>
</html>

當然,我們還可以使用一個強型別的ViewData屬性.這個為資料從控制器傳遞到檢視中提供更好的型別檢測.下面的示例是使用強型別的ViewData,檢視頁是繼承自ViewPage<T>的:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="MvcApplication.Views.Billing.Account"%>
<head id="Head1" runat="server">
  
<title>ViewData Property - Strongly Typed</title>
</head>
<body>
  
<div>
    
<%="About "+ ViewData.CompanyName %>
  
</div>
</body>

設定檢視資料

通常,你提供資料給檢視來呈現.要呈現檢視,你呼叫控制器中的RenderView方法.這裡有兩種途徑來將資料從控制器傳遞到檢視中.Controller類暴露一個ViewData的屬性,它返回鍵大小寫無關的IDictionay<string,object>型別.你可以分配索引值到這個資料字典中.看下面的示例:

public SampleController : Controller
{
    
publicvoid Welcome() 
    {
        ViewData[
"FirstName"="Joe";
        ViewData[
"LastName"="Healy";
        RenderView(
"Welcome");
    }

如果只是用一個檢視名來呼叫RenderView方法,就像上面的示例所示,這個Controller物件的ViewData屬性會被作為dictionary來傳遞給View.如果你希望使用一個強型別的ViewData屬性,你可以忽略ViewData屬性.作為代替,你建立一個你想傳遞到View中的物件,然後將它傳遞給RenderView方法.就如下面示例所示:

publicclass SampleViewData 
{
    
publicstring FirstName getset; }
    
publicstring LastName getset; }
}
 

public SampleController : Controller 
{
    
publicvoid Welcome() {
        SampleViewData viewData 
=new SampleViewData();
        viewData.FirstName 
="Joe";
        viewData.LastName 
="Healy";
        RenderView(
"Welcome", viewData);
    }

}

在Actions方法之間傳遞狀態

Action方法很可能必需傳遞資料到另外一個Action中,就好像當一個form提交的時候發生了錯誤,那樣的話,使用者應該被重定向到一個可以顯示出錯資訊的頁面中.
在Action方法呼叫控制器的RedirectToAction方法呼叫其他Action之前,Action方法可以設定Controller的TempData屬性到任意一個物件.這個TempData屬性值是儲存在session中的.另外一個Action可以檢查TempData屬性並獲取值來在它自己的檢視中顯示.TempData的值只是在一個請求到下一個請求中保留.
下面是示例演示瞭如何捕捉錯誤並重定向到一個使用原始資料的錯誤頁中:

<form action="/App/InsertCustomer">
  
<%if (ViewData.ErrorMessage !=null) { %>
    The following error occurred while inserting the customer data:
    
<br />
    
<%= ViewData.ErrorMessage %>
    
<br />
  
<% } %> 

  First name: 
<input type="text" name="firstName"
      value
="<%= ViewData.FirstName %>"/><br />
  Last name: 
<input type="text" name="lastName"
      value
="<%= ViewData.LastName %>"/><br /> 

    
<input type="submit" value="Insert"/>
</form> Action間傳遞資料