ASP.NET MVC 視圖概覽 (C#)

來源:互聯網
上載者:User

此教程向你提供 ASP.NET MVC 視圖簡介, 視圖資料, 和 HTML Helpers。教程最後,你應該會理解如何建立新視圖,從控制器傳遞資料到視圖,和使用 use HTML Helpers 在視圖中產生內容。

理解視圖

不像 ASP.NET 或者ASP, ASP.NET MVC 並不包括任何直接對應頁面的東西。 在 ASP.NET MVC 應用程式中,硬碟上並不存在與你輸入瀏覽器地址欄中的URL對應的頁面。在ASP.NET MVC應用程式中與頁面最接近的東西是稱為視圖的東西。

ASP.NET MVC 應用程式, 傳入的瀏覽器請求被映射到控制器 actions。控制器 action 可能返回一個視圖。然而,控制器可能執行其他類型的action,比如將你重新導向到另一個控制器 action。

代碼1 包含一個簡單的名為 HomeController的控制器。 HomeController 暴露了2個控制器 actions 名為 Index() 和 Details()。

代碼1 – HomeController.cs

using System.Web.Mvc;namespace MvcApplication1.Controllers{    [HandleError]    public class HomeController : Controller    {        public ActionResult Index()        {            return View();        }        public ActionResult Details()        {            return RedirectToAction("Index");        }    }}

你可以在瀏覽器地址欄中輸入以下URL來調用第一個action,  Index() action:

/Home/Index

你可以在瀏覽器地址欄輸入這個來調用第二個action,  Details() action:

/Home/Details

Index() action 返回一個視圖。大多數你建立的action都是返回視圖的。然而,一個action可以返回其他類型的 action result。例如, Details() action 返回一個 RedirectToActionResult ,它將傳入的請求重新導向到 Index() action。

Index() action 只有簡單的一行代碼:

View();

這行代碼返回一個必須位於你的web伺服器以下路徑的視圖:

/Views/Home/Index.aspx

該路徑的視圖由控制器名稱和控制器action名稱來推斷。

如果你願意,你可以顯式指定視圖名稱。下面這行代碼返回一個名為"Fred"的視圖:

View(“Fred”);

當這行代碼被執行時,視圖從以下路徑返回:

/Views/Home/Fred.aspx

如果你要為你的ASP.NET MVC程式建立單元測試那麼顯式指定視圖名稱是一個好主意。那樣,你可以建立單元測試來驗證預期的視圖是否由一個控制器action返回。

向視圖新增內容

視圖是一個可以包含指令碼的標準的 (X)HTML 文檔。使用指令碼來向視圖添加動態內容。

例如,代碼2的視圖顯示了當前日期與時間。

代碼 2 – /Views/Home/Index.aspx

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head id="Head1" runat="server">    <title>Index</title></head><body>    <div>                The current date and time is    <% Response.Write(DateTime.Now);%>        </div></body></html>

注意代碼2 中的HTML頁面的body包含了以下指令碼:

<% Response.Write(DateTime.Now);%>

使用指令碼限定符 <% 和 %> 來標示指令碼的開始與結束。這個指令碼是用C#寫的。通過調用Response.Write()方法顯示當前日期與時間在瀏覽器上。 指令碼限定符 <% 和 %> 可以用來執行一到多個語句。

既然使用 Response.Write() 如此頻繁, 微軟提供一個調用Response.Write()方法的捷徑。代碼 3 中的視圖使用限定符 <%= 和 %> 作為調用Response.Write()的捷徑。

代碼 3 – Views/Home/Index2.aspx

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head id="Head1" runat="server">    <title>Index</title></head><body>    <div>                The current date and time is    <%=DateTime.Now %>        </div></body></html>

你可以使用任何 .NET 語言在視圖中產生動態內容。通常,使用 Visual Basic .NET 或者 C# 來寫你的控制器和視圖。

使用 HTML Helpers 來產生視圖內容

要更簡單地為視圖新增內容,可以利用稱為 HTML Helper 的東西。 HTML Helper, 通常是一個產生字串的方法。可以使用 HTML Helper 產生標準 HTML 元素諸如輸入框,超連結,下拉框和列表框。

例如,代碼4中的視圖利用了3個 HTML Helper -- BeginForm(), TextBox() 和Password() helper -- 來產生一個登入表單 (見圖1).

代碼4 -- /Views/Home/Login.aspx

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head id="Head1" runat="server">    <title>Login Form</title></head><body>    <div>        <% using (Html.BeginForm())       { %>                <label for="UserName">User Name:</label>        <br />        <%= Html.TextBox("UserName") %>                <br /><br />                    <label for="Password">Password:</label>        <br />        <%= Html.Password("Password") %>                <br /><br />        <input type="submit" value="Log in" />                <% } %>        </div></body></html>

圖01: 一個標準的登入表單(點擊查看完整大小)

所有的 HTML Helper 方法都是由視圖的Html屬性來調用的。例如,調用Html.TextBox()方法呈現一個TextBox。

注意當調用 Html.TextBox() 和 Html.Password() helper時要使用指令碼限定符 <%= 和 %> 。這些 helper 僅僅返回一個字串。你需要調用 Response.Write() 以呈現字串到瀏覽器。

使用 HTML Helper 方法是可選的。它們使你的生活更簡單,因為減少了你需要寫的HTML和指令碼數量。代碼5中的視圖呈現了與代碼4中一樣的表單,但是沒有使用 HTML Helper。

代碼5 -- /Views/Home/Login.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index4.aspx.cs" Inherits="MvcApp.Views.Home.Index4" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head id="Head1" runat="server">    <title>Login Form without Help</title></head><body>    <div>    <form method="post" action="/Home/Login">        <label for="userName">User Name:</label>    <br />    <input name="userName" />        <br /><br />        <label for="password">Password:</label>    <br />    <input name="password" type="password" />        <br /><br />    <input type="submit" value="Log In" />        </form>        </div></body></html>

你還可以建立自己的 HTML Helper。例如,你可以建立一個 GridView() helper 方法在一個HTML 表格裡自動顯示一組資料庫記錄。我將在教程《建立自訂 HTML Helpers》中探討這個話題。

使用視圖資料向視圖傳送資料

使用視圖資料從控制器傳送資料到視圖。將視圖資料想象成通過郵件發送的包。所有從控制器傳送到視圖的資料必須使用這個包來發送。例如,代碼6中的控制器向視圖資料添加一個資訊。

代碼6 – ProductController.cs

using System.Web.Mvc;namespace MvcApplication1.Controllers{    public class ProductController : Controller    {        public ActionResult Index()        {            ViewData["message"] = "Hello World!";            return View();        }    }}

控制器的 ViewData 屬性工作表示一個索引值對集合。在代碼 6, Index() 方法向視圖資料集合添加一個名為message的項,值為 “Hello World!”。當視圖由Index()方法返回時,視圖資料自動傳送到視圖中。

代碼7中的視圖從視圖資料中取得message並將message呈現到瀏覽器。

代碼7 -- /Views/Product/Index.aspx

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head id="Head1" runat="server">    <title>Product Index</title></head><body>    <div>        <%= Html.Encode(ViewData["message"]) %>        </div></body></html>

注意當呈現message時,視圖利用了HTML Helper 方法 。 Html.Encode() 將特殊字元例如 < 和 > 編碼為可以在網頁安全顯示的字元。當你要呈現使用者提交到網站的內容時,應該將內容進行編碼以防止 JavaScript 注入攻擊。

(由於我們自己在ProductController裡建立了資訊,我們不必對資訊進行編碼。然而,在從視圖資料中取得顯示內容時,經常調用Html.Encode()方法是一個好的習慣。)

在代碼 7中, 我們利用了視圖資料來從控制器傳遞一個簡單的字串資訊到視圖。你還可以使用視圖資料來傳送其他類型的資料,諸如一個從控制器到視圖的資料庫記錄集合。例如,如果你要在視圖中顯示Products資料庫表中的內容,那麼你可以在視圖資料中傳遞這個資料庫記錄集合。

你還可以從控制器傳遞強型別的視圖資料到視圖。我們將在《理解強型別視圖資料和視圖》教程中探討這個話題。

總結

這篇教程提供了ASP.NET MVC 視圖,視圖資料和 HTML Helper的簡介。在第一節,你學到了如何添加一個新的視圖到你的工程中。你學到了必須在正確的檔案夾下添加視圖以從特定控制器中調用。接下來,我們討論了HTML Helper的話題。你學到了HTML Helper如何讓你簡單地產生標準HTML內容。 最後,你學到了如何利用視圖資料來從控制器傳遞資料到視圖中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.