1. 程式人生 > >[譯]MVC網站教程(三):動態佈局和站點管理

[譯]MVC網站教程(三):動態佈局和站點管理

目錄

1.介紹

2.軟體環境

5.控制器擴充套件

1)資料實體

2)站點設定

3)站點檔案

介紹

MVC網站教程”系列的目的是教你如何使用 ASP.NET MVC 建立一個基本的、可擴充套件的網站。

3)MVC網站教程(三):動態佈局和站點管理(涉及技術:AJAXjqGridController擴充套件、HTML Helpers等等)

系列的第一篇文章主要講解如何去建立一個支援多語言的MVC網站,同時也講解了使用者認證和註冊機制的實現。使用了微軟的Entity Framework框架和LINQ查詢技術。

系列的第二篇文章,提出了詳細的異常管理規則並在ASP.NET MVC網站中實現異常管理,還提供一些通用的日誌記錄和異常管理的原始碼。這些原始碼不僅可以在任何ASP.NET網站中被重用(或經過比較小的改動適用),而且可以重用到任何.NET專案中。

系列的第三篇文章(即本文),實現了動態佈局和站點管理,使用了AJAXjqGrid、自定義操作結果、控制器擴充套件、HTML幫助器,還使用了一些通用的C#原始碼和javascript指令碼,這些都能被擴充套件和被重用到其它專案中。

MVC網站教程”系列的示例網站是採用增量式和迭代式軟體過程開發的,這意味著系列中每一篇博文會在前一篇的解決方案中新增更多的功能,所以本文提供的示例下載只包含系列目前為止所介紹的功能。

網站的佈局通常包括標題頁首、選單和頁尾。注意,這些佈局對大多數網站都是不變的。

動態佈局,意思是網站管理員能通過網站應用程式提供的管理頁面修改網站的佈局。管理員的所有修改資料都會儲存在資料庫中,並且從此以後網站的佈局就會按照網站管理員的設定呈現。因此網站管理員能通過web瀏覽器在任何時候、任何地點改變網站的佈局。

本博文主要包含三個部分。第一部分描述網站中使用的構建塊;第二部分演示使用網站管理頁面來動態佈局;第三部分就如何擴充套件動態佈局給出一些提示。

網站的構建塊(如:自定義操作結果、控制器擴充套件、自定義HTML幫助器以及一些其他公用類,Razor檢視和Javascript指令碼等等)以及整個站點框架你可以重用和擴充套件成更復雜的網站。

軟體環境

1..NET 4.0 Framework

2.Visual Studio 2010 (or Express edition)

3.ASP.NET MVC 4.0

4.SQL Server 2008 R2 (or Express Edition version 10.50.2500.0)

在執行示例程式碼之前

在執行示例程式碼之前,你應該做下面事情:

1.首先使用“管理員身份”執行CreateEventLogEntry控制檯專案程式產生的exe,用來在事件日誌中建立“MVC Basic”事件源。(EventLog在寫日誌時會建立指定名稱的類別預設為“應用程式”的事件源。但是ASP.NET網站沒有足夠的許可權來建立事件源,需要本地桌面應用程式)

2.在你的SQL Server伺服器中建立一個名為MvcBasicSite的資料庫,然後用我提供的MvcBasicSiteDatabase.bak檔案進行資料庫還原。

3.修改MVC應用程式示例的Web.config配置檔案中的連結字串。

示例帳號

1)管理員帳戶:Administrator密碼:tm77dac

2)普通帳戶: Ana密碼:ana

本博文示例下載:

自定義操作結果和控制器擴充套件

在本節中,我將介紹自定義操作結果和控制器擴充套件,用於建立站點的動態佈局。

在控制器類中,響應使用者輸入的每個操作方法執行完工作後返回一個操作結果。操作結果代表MVC框架執行完一個操作指令。所有操作結果類必須繼承自ActionResult抽象類。這個抽象類包含下面成員:

public abstract class ActionResult
{
    // Summary:
    //     Initializes a new instance of the System.Web.Mvc.ActionResult class.
    protected ActionResult();

    // Summary:
    //     Enables processing of the result of an action method by a custom type that
    //     inherits from the System.Web.Mvc.ActionResult class.
    //
    // Parameters:
    //   context:
    //     The context in which the result is executed. The context information includes
    //     the controller, HTTP content, request context, and route data.
    public abstract void ExecuteResult(ControllerContext context);
}

這裡有一系列MVC4.0框架提供的操作結果,它們都直接或間接繼承自ActionResult抽象類:

1)ContentResult

2)EmptyResult

3)FileResult

4)FileContentResult

5)FilePathResult

6)FileStreamResult

7)HttpStatusCodeResult

8)HttpUnauthorizedResult

9)JavaScriptResult

10)JsonResult

11)RedirectResult

12)RedirectToRouteResult

13)PartialViewResult

14)ViewResultBase

15)ViewResult

為了建立動態佈局,我使用了一些上面已經存在的操作結果類,但我也建立下面兩個自定義操作結果類:

1)OpenFileResult

2)ImageResult

1.OpenFileResult

這個操作結果類被用於在新瀏覽器視窗中開啟一個檔案。在本網站示例中用於在獨立的瀏覽器視窗中開啟一個PDFJPGPNG檔案,同樣也能用於開啟其他型別的檔案。

image

從上面類圖可知,OpenFileResult包含3個屬性,被用於設定內容型別、檔名字和檔案存放的虛擬路徑。主要功能方法ExecuteResult()如下:

public override void ExecuteResult(ControllerContext context)
{
    context.HttpContext.Response.Clear();
    context.HttpContext.Response.ClearContent();
    //
    if(this.ContentType != null)
        context.HttpContext.Response.ContentType = ContentType;
    else
        context.HttpContext.Response.AddHeader("content-disposition", "attachment;filename=" + this.FileName);
    //
    context.HttpContext.Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
    string filePath = (_isLocal 
        ? this.FileName 
        : string.Format("{0}\\{1}", context.HttpContext.Server.MapPath(this.VirtualPath), this.FileName));
    //
    if (System.IO.File.Exists(filePath))
    {
        context.HttpContext.Response.TransmitFile(filePath);
    }
    else
    {
        context.HttpContext.Response.Write(Resources.Resource.OpenFileResultFileNotFound);
    }
    //
    context.HttpContext.Response.End();
}

從上面程式碼可知,這個方法首先設定內容型別,然後將檔案傳送到HTTP響應中,收到響應結果的瀏覽器將在新視窗中開啟一個檔案。

應該像下面例子一樣使用OpenFileResult

public ActionResult GetFileResult(int id)
{
    SiteDocument SiteDocument = _db.SiteDocuments.FirstOrDefault(d => d.ID == id);
    if (SiteDocument == null)
        return RedirectToAction("Home", "Index");
    //
    OpenFileResult result = new OpenFileResult(
       SiteDocument.IsSystemDoc == null && this.Request.IsLocal, "\\Content\\Doc");
    result.FileName = SiteDocument.FileFullName;
    result.ContentType = SiteDocument.ContentType;
    //
    return result;
}

如果是PDF文件,那麼將在瀏覽器新視窗中開啟PDF

2.ImageResult

這個操作結果類將圖片資料流在當前檢視中呈現一個圖片。這個資料流可能是從資料庫中載入的包含影象的資料流、也可能是從一個檔案中載入的包含影象的檔案流、或者其他地方傳入的資料流。

image

從上面類圖中可知,這個類包含兩個屬性用於設定內容型別和影象流,主要功能方法ExecuteResult()如下:

public override void ExecuteResult(ControllerContext context)
{
    if (context == null)
        throw new ArgumentNullException("context");
    //
    try
    {
        HttpResponseBase response = context.HttpContext.Response;
        response.ContentType = this.ContentType;
        //
        if (this.ImageStream == null)
        {
            string filePath = context.HttpContext.Server.MapPath("/Content/noimageSmall.jpg");
            System.Drawing.Image imageIn = System.Drawing.Image.FromFile(filePath);
            MemoryStream ms = new MemoryStream();
            //
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            response.OutputStream.Write(ms.ToArray(), 0, (int)ms.Length);
        }
        else
        {
            byte[] buffer = new byte[4096];
            //
            while (true)
            {
                int read = this.ImageStream.Read(buffer, 0, buffer.Length);
                if (read == 0)
                    break;
                //
                response.OutputStream.Write(buffer, 0, read);
            }
        }
        //
        response.End();
    }
    catch (Exception ex)
    {
        MvcBasicLog.LogException(ex);
    }
}

從上面原始碼中可知,這個方法首先設定內容型別,然後讀取影象並存到資料流中,最後將資料流以位元組流的方式寫到HTTP響應輸出流中。在接收到響應的瀏覽器上會將圖片呈現到當前檢視中。

ImageResult操作結果的使用方法和上文提到的OpenFileResult相似,但是在MVC示例網站中我是直接作為控制器擴充套件(ControllerExtensions類)來使用的,詳細見下文。

相關推薦

[]MVC網站教程動態佈局站點管理

目錄 1.介紹 2.軟體環境 5.控制器擴充套件 1)資料實體 2)站點設定 3)站點檔案 介紹 “MVC網站教程”系列的目的是教你如何使用 ASP.NET MVC 建立一個基本的、可擴充套件的網站。 3)MVC網站教程(三

[]MVC網站教程多語言網站框架

本文簡介 本博文介紹了 Visual Studio 工具生成的 ASP.NET MVC3 站點的基本框架;怎樣實現網站的語言的國際化與本地化功能,從零開始實現使用者身份認證機制,從零開始實現使用者註冊機制,實現自定義的MVC驗證特性…… 本系列包含四篇,在codeproject中都評級為4+顆星。我會全部

[]MVC網站教程MVC4網站中整合jqGrid表格外掛系列完結

目錄 1.介紹 2.軟體環境 介紹 “MVC網站教程”系列的目的是教你如何使用 ASP.NET MVC 建立一個基本的、可擴充套件的網站。 4)MVC網站教程(四):MVC4網站中整合jqGrid表格外掛(涉及技術:AJAX,JSON,jQue

[]MVC網站教程異常管理

介紹 “MVC網站教程”系列的目的是教你如何使用 ASP.NET MVC 建立一個基本的、可擴充套件的網站。 2)MVC網站教程(二):異常管理 主要講解如何去建立一個多語言MVC網站,同時也講解了使用者認證和註冊機制的實現。使用了微軟的Entity Framework框架和LINQ

我的BRF+自學教程動態技術

-a gid values 條目 its ans sta sym 函數 開發者們可以在編程中使用各種動態技術,比如RTTS,比如通過動態的類創建和多態來實現功能的平滑擴展。BRF+對象也有一定動態能力。本文將介紹3種不同場景下的動態實踐方式。其中第一種是純配置的,第二和第三

Git 教程倉庫與分支

ide 不但 clas version span 右上角 director discard pre 遠程倉庫 到目前為止,我們已經掌握了如何在Git倉庫裏對一個文件進行時光穿梭,你再也不用擔心文件備份或者丟失的問題了。 可是有用過集中式版本控制系統SVN的童鞋會站出來說,這

Redux 入門教程React-Redux 的用法

建立 www counter reducer creates 所有 port 操作 lin 作者: 阮一峰 前兩篇教程介紹了 Redux 的基本用法和異步操作,今天是最後一部分,介紹如何在 React 項目中使用 Redux。 為了方便使用,Redux 的作者封裝

VSphere系列教程ESXI 主機設定開機自動啟動虛擬機器

一、配置 ESXI 主機        登入 WebClient,管理 -> 自動啟動 -> 編輯設定                配置成如下內容,儲

Linux小小白入門教程Linux資料夾

學習一個作業系統的使用,最先應該搞清楚的是他的C盤、D盤、E盤。 一、Linux的資料夾 Linux和Windows最大的區別是,Windows有C盤、D盤的概念,但是在Linux上沒有碟符的概念。Linux只有一個碟符,那就是“/”。你沒有看錯,就是一個斜杆。這個

python3教程程式碼執行環境及你的第一段python程式碼

程式碼執行環境 我們安裝完Python後,可以使用ide或idle來執行程式。 關於ide我們之後會專門進行介紹,我們前期一般是使用idle來學習及執行程式碼。 在Windows上一般有兩個idle ,一個是cmd ,另一個則是python自帶的。 cmd的話,和上一節課程一樣,

jmeter教程介面測試初探

做測試,怎麼測試,要測試什麼,得有依據。功能測試的依據是需求規格說明書,介面測試的依據,通常有需求規格說明書及介面開發文件。但這些文件,並不是每個公司都有的,有的可能沒有介面文件,甚至需求文件都沒有,這個時候,就只能與產品、開發溝通來確定介面的邏輯了。 現在假定有個登入的介面,需求是使用者名稱和

kettle 教程條件判斷 Switch Case

介紹 Switch / Case,顧名思義,類似 Java 中的 Switch / Case,用於進行條件判斷。是 kettle 中一個非常常用元件。 使用起來也非常簡單,我們直接來看例子。 場景介紹 有一個 user 表,表中資料如下:

【翻譯】CodeMix使用教程Emmet

CodeMix中的Emmet Emmet是改善開發人員工作流程的好方法。 使用Emmet,可以動態解析類似CSS的表示式,並根據您在縮寫中鍵入的內容生成輸出。 Emmet支援內置於CodeMix中,無需擴充套件。 CodeMix外掛與基於Eclipse的IDE和工具(如MyEclips

Navicat使用教程使用MySQL日誌第3部分——慢速日誌

下載Navicat for MySQL最新版本 Navicat for MySQL 是一套管理和開發 MySQL 或 MariaDB 的理想解決方案。使用Navicat for MySQL可以同時連線到 MySQL 和 MariaDB。Navicat for MySQL提供了強大的前端功能,為

Elasticsearch 通關教程 索引別名Aliases問題

業務問題 業務需求是不斷變化迭代的,也許我們之前寫的某個業務邏輯在下個版本就變化了,我們可能需要修改原來的設計,例如資料庫可能需要新增一個欄位或刪減一個欄位,而在搜尋中也會發生這件事,即使你認為現在的索引設計已經很完美了,在生產環境中,還是有可能需要做一些修改的,需要新增對映欄位或者需要修改欄位型別等等。

【鏈塊技術55期】超級賬本Fabric教程Hyperledger Fabric 1.0架構及原理

原文連結:超級賬本Fabric教程(三):Hyperledger Fabric 1.0架構及原理   如果說以比特幣為代表的貨幣區塊鏈技術為 1.0,以以太坊為代表的合同區塊鏈技術為 2.0,那麼實現了完備的許可權控制和安全保障的 Hyperledger 專案毫無疑問代表著區塊鏈技

Vue.js教程v-if條件判斷

v-if是繼v-bind之後的又一個v-xxx系列 前言 v-if這是我們學習Vue中的的第二個v-xxx系列。學到這裡,不得不提一下的是,所有v-bind或者v-if所關聯的都是Vue的動態變數,

NPOI 2.0 教程EXCEL 基本格式設定之ICellStyle

轉載請註明出處 http://blog.csdn.net/fujie724 前兩篇,我們已經學習瞭如何用NPOI來建立和編輯Excel,並且已經熟悉了HSSFWorkbook,ISheet,IRow和ICell。 接下來我們把它變得漂亮一點。 ICellStyle——單

.net core mvc初級教程

一、更正popper.js的錯誤 二、打包js 三、新增服務與路由,中介軟體 一、更正popper.js的錯誤 emmm,今天來更正些昨天的錯誤 那個package.json裡面的popper改為"popper.js": “1.14.6”,後面的版本也改下,然後點選儲存 {

API 系列教程使用 API Resource 來建立自定義 JSON 格式的 API

上一篇教程中我們通過 jwt-auth 實現了 Laravel 的 API 認證。 使用者請求登入介面 http://apidemo.test/api/auth/login 登入成功後,獲取到 JSON 響應,響應頭會帶有 token 資訊。 Authorizatio