ASP.NET MVC案例教程(四)

來源:互聯網
上載者:User

前言

通過前幾篇文章,我們已經能比較自如的使用ASP.NET MVC來呈現頁面和資料了。但是,有一個大問題沒有解決:如何處理表單資料。例如,我們將要實現的公告發布功能,使用者肯定是在某個表單頁面輸入標題、本文等內容,而後提交,然後表單資料要被傳遞到相應的地方交由商務邏輯組件處理。

在傳統的ASP.NET下,使用的是Model1模式,每個aspx頁面有一個同名的aspx.cs檔案,當提交表單時,預設資料被提交到這個同名aspx.cs檔案中某個方法下處理。但是,在ASP.NET MVC中,這種方法不能用了,因為我們換用了Model2模式,不能再用同名代碼檔案來處理aspx的提交請求(但是這不表明同名代碼檔案就沒有用了,實際上,它依然會被執行,但是我們不提倡在裡面處理任何邏輯,但是,有時會利用它進行一些初始化操作。),那麼應該怎麼做呢?不多講,我們以例子說明問題。

下面我們一步一步完成“MVC公告發布系統”的公告發布功能,等做完這個功能,上面的問題就明了了。

建立輸入資訊頁面

下面,正式開始我們的工作。首先,我要建立一個頁面,用來讓使用者輸入公告資訊。而我們知道,在ASP.NET MVC中不能直接請求aspx檔案,任何請求都要通過Controller,所以,我們首先在Controllers目錄下建立一個新的Controller類,名叫AnnounceController。刪除其中自動產生的Index方法,建立一個名叫Release的Action方法,具體代碼如下。

AnnounceController.cs:

 using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Mvc.Ajax;using MVCDemo.Models;using MVCDemo.Models.Interfaces;using MVCDemo.Models.Entities;namespace MVCDemo.Controllers{public class AnnounceController : Controller{public ActionResult Release(){ICategoryService cServ = ServiceBuilder.BuildCategoryService();List categories = cServ.GetAll();ViewData["Categories"] = new SelectList(categories, "ID", "Name");return View("Release");}}}

這個就是要呈現表單頁的Action方法,看看它做了什麼:它首先取出所有的分類,然後將它們轉成SelectList類型存入ViewData,最後呈現Release視圖。

為什麼要取出所有分類呢?因為我們在發布公告時希望有個下拉式清單方塊列出所有公告名稱,讓使用者可以選擇要發布的公告屬於哪個分類。而SelectList是ASP.NET MVC中用於綁定到下拉式清單的類型。它有很多重載的構造方法,其中我使用的是三個參數的,它們分別表示:產生資料的枚舉,綁定到value的欄位名,綁定到列表名稱的欄位名。這裡,將把所有分類實體集合綁定到下拉式清單,而ID屬性作為值,Name屬性作為顯示在列表框中的名字。

如果我們不需要下拉式清單方塊來顯示所有分類,那麼Release方法只需一行return View("Release");就可以了。

Action方法做完了,我們還需要視圖。在Views目錄下建立Announce目錄,再在這個Announce目錄下建立Release.aspx視圖。代碼如下。

Release.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Release.aspx.cs" Inherits="MVCDemo.Views.Announce.Release" %><%@ Import Namespace="MVCDemo.Models.Entities" %><!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 runat="server"><title></title></head><body><% SelectList categories = ViewData["Categories"] as SelectList; %>   <div>       <h1>MVC公告發布系統——發布公告</h1>        <% Html.BeginForm("DoRelease","Announce",FormMethod.Post); %>        <dl>            <dt>標題:</dt>           <dd><%= Html.TextBox("Title") %></dd>            <dt>分類:</dt>            <dd><%= Html.DropDownList("Category",categories) %></dd>            <dt>內容:</dt>            <dd><%= Html.TextArea("Content") %></dd>        </dl>        <input type="submit" value="發布" />        <% Html.EndForm(); %>    </div></body></html>

代碼不複雜,但是要注意幾個地方。categories不多說了,這是剛才我們傳遞過來的所有分類組成的清單項目。我覺得大家迷惑的可能是那些Html.***的東西,其實,Html是ViewPage的中的一個對象(ViewPage是所有視圖的基類),它主要的左右就是產生各種表單項(先這麼認為吧,其實它還有其他功能),例如Html.BeginForm就是說這裡開始一個form標籤,而Html.EndForm當然是form標籤結束。其他幾個,看名字相信大家也猜出來了。

至於為什麼這麼做,也不直接使用原始的HTML標籤,我先不多說,以後大家做多了自然就理解了,目前大家只要知道,這樣做可以避免一個url問題以及讓url更靈活就行了。

回到這個頁面,BeginForm有三個參數,分別是提交請求的Action名,提交請求的Controller名和請求方式。所以,這個頁面的意思就是使用post方法請求http://localhost/Announce/DoRelease這個Action來處理我們的請求。

頁面中有三個輸入表單和一個提交按鈕。三個輸入表單分別是:名叫Title的文字框,名叫Content的文本域和名叫Category的下拉式清單方塊。注意下拉式清單是怎麼綁定的,只要將含有資料的SelectList作為第二個參數就行了。完成後,頁面是這樣子的:

處理請求

現在我們可以輸入資訊了,但是如果你輸入後點提交,你會發現產生了經典的404錯誤。剛才我們說了,表單提交到的Action是Announce下的DoRelease,但是現在沒有這個Action,當然會404了。下面,我們來建立這個處理常式。

回到AnnounceController,建立Action方法DoRelease,具體代碼如下。

AnnounceController.cs:

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Mvc.Ajax;using MVCDemo.Models;using MVCDemo.Models.Interfaces;using MVCDemo.Models.Entities;namespace MVCDemo.Controllers{public class AnnounceController : Controller{public ActionResult Release(){ICategoryService cServ = ServiceBuilder.BuildCategoryService();List categories = cServ.GetAll();ViewData["Categories"] = new SelectList(categories, "ID", "Name");return View("Release");}public ActionResult DoRelease(){AnnounceInfo announce = new AnnounceInfo(){ID = 1,Title = Request.Form["Title"],Category = Int32.Parse(Request.Form["Category"]),Content = Request.Form["Content"],};IAnnounceService aServ = ServiceBuilder.BuildAnnounceService();aServ.Release(announce);ViewData["Announce"] = announce;return View("ReleaseSucceed");}}}

我們看,它首先建立一個AnnounceInfo類型的實體類,用來存貯這個新的公告的資訊。注意它是怎麼得到表單資訊的,對了,用了Request.Form["表單名"],這就是獲得表單資訊的一種方法,當然還有其他方法,但是我推薦這一種。注意,這裡的表單名就是我們使用Html.***方法產生表單時的名字。

OK,下面就是調用商務邏輯組件,完成發布公告功能。

但是這裡有個問題,我們的商務邏輯組件是Mock的,也就是說其實什麼都沒做啊。如果是真的商務邏輯組件,我們可以去資料庫看看有沒有添加公告資訊成功,可是這裡沒有,我們要怎麼證明表單資料傳遞過來了呢?於是我想了一個辦法,有新加了一個ReleaseSucceed視圖,用來顯示新發布公告的資訊,以此證明我們確實把表單資訊傳過來了。ReleaseSucceed視圖如下:

ReleaseSucceed.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ReleaseSucceed.aspx.cs" Inherits="MVCDemo.Views.Announce.ReleaseSucceed" %><%@ Import Namespace="MVCDemo.Models.Entities" %><!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 runat="server">    <title></title></head><body>    <% AnnounceInfo announce = ViewData["Announce"] as AnnounceInfo; %>    <div>        <h1>MVC公告發布系統——發布公告成功</h1>        <dl>            <dt>ID:</dt>            <dd><%= announce.ID %></dd>            <dt>標題:</dt>           <dd><%= announce.Title %></dd>            <dt>類別ID:</dt>            <dd><%= announce.Category %></dd>            <dt>內容:</dt>            <dd><%= announce.Content %></dd>        </dl>    </div></body></html>

這些代碼就不用我過多解釋了。下面,我們輸入一些資訊,提交看看:

看到沒有,我沒有騙你們,表單資料真的傳過來了!

小結

通過這四篇文章,我們已經瞭解了ASP.NET MVC的基本原理,並且已經會呈現資料頁面及傳遞表單資料處理了。會了這些,其實已經可以應付絕大多數主要開發了。從下篇開始,我們接觸一些進階點的內容。下篇將說一下ASP.NET MVC如何與ASP.NET AJAX及JQuery結合,再後面,會講到攔截器及與Silverlight結合的內容。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.