菜鳥學ASP.NET MVC4入門筆記

来源:https://www.cnblogs.com/liubf86/archive/2018/08/08/9442373.html
-Advertisement-
Play Games

ASP.NET MVC 是微軟官方提供的以MVC模式為基礎的ASP.NET Web應用程式(Web Application)框架,它由Castle的MonoRail而來。 MVC 編程模式 MVC 是三種 ASP.NET 編程模式中的一種。 MVC 是一種使用 MVC(Model View Cont ...


  ASP.NET MVC 是微軟官方提供的以MVC模式為基礎的ASP.NET Web應用程式(Web Application)框架,它由Castle的MonoRail而來。

MVC 編程模式

       MVC 是三種 ASP.NET 編程模式中的一種。

       MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程式的模式。

    (1)Model(模型)表示應用程式核心(比如資料庫記錄列表)。

    (2)View(視圖)顯示數據(資料庫記錄)。

    (3)Controller(控制器)處理輸入(寫入資料庫記錄)。

       MVC 模式同時提供了對 HTML、CSS 和 JavaScript 的完全控制。Model(模型)是應用程式中用於處理應用程式數據邏輯的部分。通常模型對象負責在資料庫中存取數據。View(視圖)是應用程式中處理數據顯示的部分。通常視圖是依據模型數據創建的。Controller(控制器)是應用程式中處理用戶交互的部分。通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。       

       新建一個ASP.NET MVC4應用程式,結構如下圖所示:


對各個文件夾的說明:

(1)App_Data 文件夾用於存儲應用程式數據。   

(2)Content 文件夾用於存放靜態文件,比如樣式表(CSS 文件)、圖標和圖像。 

(3)Controllers 文件夾包含負責處理用戶輸入和相應的控制器類。

(4)Models 文件夾包含表示應用程式模型的類。模型控制並操作應用程式的數據。

(5)Views 文件夾用於存儲與應用程式的顯示相關的 HTML 文件(用戶界面)。

(6)Scripts 文件夾存儲應用程式的 JavaScript 文件。

 下麵就主要的Controller、Model和View做出說明。

一、控制器

1、描述

       控制器(Controller)主要負責響應用戶的輸入,併在響應時修改模型(Model)。通過這種方式,控制器主要關註的是應用程式流、輸入數據的處理,以及對相關視圖(View)輸出數據的提供。

2、簡單控制器

       新建一個ASP.NET MVC4應用程式,會自動生成一個HomeController和AccountController。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
            return View();
        }
    }
}

  

      直接按F5運行程式即可看到index試圖中的內容,此時瀏覽器的URL為:

       http://localhost:4573,或者修改瀏覽器地址為:

       http://localhost:4573/home

       http://localhost:4573/home/index

       程式預設會托管在VS2013自帶的IIS中,採用的埠號為4573。如果程式托管在MyWeb.com中,則URL應為:

       http://MyWeb.com/home/index。

3、控制器操作中的參數

       前面的例子Action中返回的是字元串常量,下麵就讓它們通過相應URL傳進來的參數動態地執行操作。

       在這裡,我們使用HttpUtility.HtmlEncode來預處理用戶輸入。這樣就能阻止用戶用鏈接向視圖中註入JavaScriptd代碼或HTML標記,比如/home/sayhello?content=<script>window.location='http://www.baidu.com'</script>。


 
public string SayHello(string content)
{
    string message = HttpUtility.HtmlEncode("Hello " + content);
    return message;
}

 

  1.  
  2. public string Details(int Id)
    {
        return "ID:" + Id;
    }

     

4、路由---將URL映射到動作

       框架是如何知道將URL映射到一個特定的控制動作的?答案就在Global.asax文件的RegisterRoutes方法中。該方法定義了將一個URL模式映射到控制器或動作的路由。

using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace MvcApplication1
{
    // 註意: 有關啟用 IIS6 或 IIS7 經典模式的說明,
    // 請訪問 http://go.microsoft.com/?LinkId=9394801
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
    }
}

 

  1. 在RegisterRoutes方法上按F12,轉到該方法的定義,如下:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;  
 
namespace MvcApplication1
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                                name: "Default",
                                url: "{controller}/{action}/{id}",
                                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                            );
        }
    }
}

   

5、控制器總結

(1)不需要做任何配置,只需瀏覽到/控制器/動作URL即可;

(2)控制器是一個非常簡單的類,繼承自System.Web.Mvc.Controller類;

(3)用控制器在瀏覽器中顯示文本,沒有用到View或Model。

二、視圖

1、作用

       提供用戶界面。一個控制器可以對應多個試圖,一個視圖可以被多個控制器使用。

       在Action名上右鍵→添加試圖→View1。

2、指定視圖

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>View1</title>
</head>
<body>
    <div>
        <h2>@ViewBag.Message</h2>
    </div>
</body>
</html>

3、ViewData和ViewBag的區別於聯繫

       在前面的例子中,使用了ViewBag的Message屬性從控制器往視圖傳遞數據,ViewData是一個特殊的字典類,可以按標準語法進行使用:ViewData["CurrentTime"]=DateTime.Now;

       這種語法也可以用動態封裝器ViewBag:ViewBag.CurrentTime=DateTime.Now;

註意:

(1)儘管只有當要訪問的關鍵字是有效的C#標識符是,ViewBag才起作用,如在ViewData["Key With Spaces"]就不能使用ViewBag訪問,編譯不通過;

(2)動態值不能作為一個參數傳遞給擴展方法。因為C#編譯器為了選擇正確的擴展方法,在編譯是必須知道每個參數真正類型。如:@Html.TextBox("name",ViewBag.Name)不會編譯通過,可以改為:

       ①@Html.TextBox("name",ViewData["Name"])

       ②@Html.TextBox("name",(string)ViewBag.Name)

4、強類型視圖

       現在需要編寫一個顯示Album實例列表的視圖。一簡單的方法就是通過ViewBag屬性把那些Album實例添加到視圖數據字典中,然後在視圖中迭代他們。

(1)首先,在Models文件夾下新建一個Album類,為了簡單起見,只定義一個Title屬性。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApplication1.Models
{
    public class Album
    {
        public string Title { get; set; }
    }
}
  1. (2)控制器
public ActionResult List()
{
    var album = new List<Album>();
    for (int i = 0; i < 10; i++)
    {
        album.Add(new Album { Title = "Product " + i.ToString() });
    }
    //一、使用ViewBag傳值
    //ViewBag.Album = album;
    //return View("ListView");
    //二、使用ViewData傳值
    ViewData["Album"] = album;
    return View("ListView");
}

  

(3)視圖

       在List上右鍵→添加視圖。

@{
    Layout = null;
}
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ListView</title>
</head>
<body>
    <div>
        <ul>
            @*一、使用ViewBag傳值*@
            @*@foreach(MvcApplication1.Models.Album a in (ViewBag.Album as IEnumerable
            <MvcApplication1.Models.Album>))
            {
                <li>@a.Title</li>
            }*@
            @*二、使用ViewBag傳值*@

            @foreach (MvcApplication1.Models.Album a in (ViewData["Album"] as IEnumerable<MvcApplication1.Models.Album>))
            {
                <li>@a.Title</li>
            }

        </ul>
        <pre name="code" class="html">
        <ul>
            @foreach(dynamic d in ViewBag.Album)
            {
                <li>@d.Title</li>
            }
 
        </ul>
    </div>
</body>
</html>

運行效果:



       註意,在枚舉之前需要動態的將ViewBag.Album轉換為IEnumerable<Album>類型,為了使代碼乾凈整潔,也可以使用dynamic關鍵字。


<ul>
    @foreach (dynamic d in ViewBag.Album)
    {
        <li>@d.Title</li>
    }
</ul> 

       請記住,ViewData是ViewDataDictionary類型的,它有一個額外的Model屬性,可以用來在視圖中獲取指定的模型對象。由於在ViewData中只能傳遞一個模型對象,因此,我們利用這一點可以很容易的實現向視圖傳遞一個特定的類對象。

       在Controller方法中,可以通過重載的List方法中傳遞模型實例來指定模型,代碼如下:

public ActionResult List()
{
    var album = new List<Album>();
    for (int i=0;i < 10; i++) 
    {
        album.Add(new Album { Title="Product " + i.ToString() });
    }
    ViewData["Album"]=album;
    return View("ListView",album);
}

@model IEnumerable<MvcApplication1.Models.Album>

@{
    Layout = null;
}

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ListView</title>
</head>
<body>
    <div>
        <ul>
            @foreach(dynamic d in Model)
            {
                <li>@d.Title</li>
            }
        </ul>
    </div>
</body>
</html>

       如果不想輸入模型類型的完全限定類型名,可使用using關鍵字聲明,如下所示:

 

@using MvcApplication1.Models

@model IEnumerable<Album>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ListView</title>
</head>
<body>
    <div>
        <ul>
            @foreach (dynamic d in Model)
            {
                <li>@d.Title</li>
            }
        </ul>
    </div>
</body>
</html>

       對於在視圖中經常使用的名稱空間,一個較好的方法就是在Views目錄下的web.config文件中聲明。

 

<system.web.webPages.razor>
    <host factoryType = "System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    < pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="MvcApplication1.Models"/>
        </namespaces>
    </pages>
</system.web.webPages.razor>
 

5、Razor視圖引擎

5.1 先來看一個簡單的例子。

@{
    Layout = null;
}

@{
    var items = new string[] { "one", "two", "three" };
}

<!DOCTYPE html>
<html>
<head>
    <title>ListView</title>
</head>

<body>
    <div>
        <ul>
            @foreach (var item in items)
            {
                <li>@item</li>
            }
        </ul>
    </div>
</body>
</html>

 

5.2 Html編碼

       因為在很多情況下需要用視圖顯示用戶輸入,如博客評論等,所以總是存在著潛在的跨站腳本註入攻擊(也成XSS),值得稱贊的是,Razor表達式是Html自動編碼的,如下不會彈出一個警示框,而是直接顯示html代碼。

 

@{
    string message = "<script>alert('haacked!');</script>";
}

 

        然而,如果想要展示Html標簽,就要返回一個System.Web.IHtml對象的實例,Razor並不對它進行編碼。當然也可以創建一個HtmlStringl實例或者使用Html.Raw便捷方法。

 

@{

    string message = "<script>alert('haacked!');</script>";

}
<span>@Html.Raw(message)</span>

  

  1. 效果:

 

 

       雖然這種自動的HTML編碼通過對一HTML形式顯示的用戶輸入進行編碼能有效的緩和XSS的脆弱性,但是對於在JavaScript中時遠遠不夠的。例如:

 

<script type="text/javascript">
    $(function ()
    {
        var message = 'Hello @Ajax.JavaScriptStringEncode(ViewBag.Message)';
        $("#message").html(message).show('slow');

    });
</script>

 

  1.        當在JavaScript中將用戶提供的值賦給變數時,要使用JavaScript字元串編碼而不僅僅是HTML編碼,記住這一點是很重要的,也就是要用@Ajax.JavaScriptStringEncode方法對用戶輸入進行編碼。

5.3 佈局

       Razor的佈局有助於使用應用程式中的多個視圖保持一致的外觀,可使用佈局為網站定義公共模板(或只是其中的一部分),公共模板包含一個或多個占位符,應用程式中的其他視圖為他們提供內容。

       下麵看一個非常簡單的佈局,新建一個名稱為MyLayout.cshtml的視圖,由於要作為公共模板,所以將其放在/Views/Shared/路徑下。

 

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
</head>
<body>
    <h1>@ViewBag.Title</h1>
    <div id="Container">@RenderBody()</div>
</body>
</html>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 加QQ群:838197940免費領取! 【Python參考書籍】 入門讀物 1.《Python基礎教程》(Beginning Python From Novice to Professional)2.《Python學習手冊》(Learning Python)3.《Python編程》(Programm ...
  • 1、Session文檔介紹 2、Session簡單應用 2.1、在Startup類的ConfigureServices方法中添加 因為Session的服務端存儲需要緩存,所以需要引入.Net core的緩存DistributedMemoryCache; 2.2、在Startup類的Configure ...
  • 前置說明 安裝 Service Fabric SDK,會在本機 C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK 生成部署腳本,如下圖: 用VS創建一個 Service Fabric 應用後, ...
  • 從上面的介紹可以看出,SignalR既然是為實時而生的,這樣就決定了其使用場所。具體適用情景有如下幾點: 聊天室,如線上客服系統,IM系統等 股票價格實時更新 消息的推送服務 游戲中人物位置的實時推送 : 游戲參考 https://blog.csdn.net/jaswhen/article/deta ...
  • MemCahe 首先介紹下memcahce的定義:是一個分散式的高速緩存系統,目前被許多網站使用以提升網站的訪問速度,尤其對於一些大型的、需要頻繁訪問資料庫的網站訪問速度提升效果十分顯著。 接下來介紹下在windows下的memcache的安裝與使用: 第一步:下載memcache安裝包 鏈接:下載 ...
  • 簡介 本篇文章將介紹C# 如何處理Excel圖形相關的問題,包括以下內容要點: 1.繪製圖形 1.1 繪製圖形並添加文本到圖形 1.2 添加圖片到圖形 1.3 設置圖形陰影效果 2. 提取圖形中的文本、圖片 3. 設置圖形的顯示、隱藏 4. 刪除圖形 4.1刪除指定圖形 4.2 刪除所有圖形 所需工 ...
  • 上一篇博文中已經實現瞭如何在頁面上使用自定義的屬性即上篇博文所示的@this.U,今天將進一步研究用戶自定義User Identity; 實現思路: 通過研究微軟自帶identity的套路,我們可以發現其實現此功能的介面為IIdentity、System.Security.Principal.IPr ...
  • 什麼是Polly? Polly是一個.NET彈性和瞬態故障處理庫.允許我們以非常順暢和線程安全的方式來執行諸如行重試,斷路,超時,故障恢復等策略。 Polly項目地址:https://github.com/App-vNext/Polly Polly提供多種彈性策略:重試(Retry),斷路器(Cir ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...