Java進擊C#——應用開發之Asp.net MVC

来源:http://www.cnblogs.com/hayasi/archive/2016/10/28/6000845.html
-Advertisement-
Play Games

上一章筆者講到關於Asp.NET的知識點。瞭解Asp.NET基本的知識點之後,我們在來學習關於C#的MVC框架就簡單多了。顯然本章就是來介紹一下關於Asp.NET MVC。對於MVC的思想筆者相信大家已經很清楚了。筆者在這裡就不多說了。我有個同學做Asp.NET開發的。他跟我講過一句話——我都快忘了 ...


本章簡言

上一章筆者講到關於Asp.NET的知識點。瞭解Asp.NET基本的知識點之後,我們在來學習關於C#的MVC框架就簡單多了。顯然本章就是來介紹一下關於Asp.NET MVC。對於MVC的思想筆者相信大家已經很清楚了。筆者在這裡就不多說了。我有個同學做Asp.NET開發的。他跟我講過一句話——我都快忘了HTML了。上一章中我們知道做Asp.NET。用純HTML那麼筆者覺得你一定會被人認為是SB。對於喜歡純手工來寫界面設計的人來講,Asp.NET MVC 決對不會讓你失望。而本文筆者可能還會用到一些struts2框架的知識來比較一下。不多說了。進入本章的內容吧。

Global.asax文件

在講Asp.NET MVC之前我們來看一下一個文件。就是Global.asax文件。那為什麼要講這個文件呢?而這個文件又有什麼作用呢?Global.asax文件全名為全局應用程式類。他跟Asp.NET MVC並沒有直接的關係。Asp.NET常常也會用到。想要創建他也很簡單。選中項目右擊》添加》新建項。

點擊添加按扭:

雙擊Global.asax:

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

namespace WebExample
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {

        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}

看了上面的代碼。筆者相信光從名字就可能看出一二。什麼意思呢?在應用開始執行的時候會去調用Application_Start方法並且只執行一次。而每次一請求的時候會去調用Application_BeginRequest方法。當用應關團的時候,會去調用Application_End。如果做B/S開發不知道Session的話,那麼筆者也無能為力了。所以對於Session_Start方法調用,筆者就不多說了。 是不是覺得JAVA跟的Web.xml的監聽事件有一點像呢。

Asp.NET MVC

筆者在學習Asp.NET MVC的時候。visual studio的Asp.NET MVC例子為筆者做了很大的貢獻。讓我們看一下visual studio的列子來瞭解一下Asp.NET MVC吧。什麼樣子創建項目。不用筆者在講了。直接看一下新建項目的對話框吧。

確定之後。會彈出下列對話框。

 

我們可以看到上面的多個選項。

空:表示建立一個什麼都沒有的Asp.NET MVC。

基本:表示建立一個最基本可以開發的Asp.NET MVC。

其他的:是面向不同業務的例子。

筆者選擇其中為Internet 應用來瞭解關於Asp.NET MVC的知識。下麵就是新建的項目結構。

App_Data文件夾:用於存放數據文件。如SQL server的MDF文件之類似。

App_Start文件夾:這個文件夾存放了一些Asp.NET MVC開始要執行的配置類。

Content文件夾:存放一些關於主題的文件。如CSS文件。

Controllers文件夾:存放控制器。即是MVC中的C

Filters文件夾:看名字就知道存放過濾器了。

Images文件夾:不用看了。就存放圖片。

Models文件夾:用於存放模型對象。

Scripts文件夾:用於存放JS文件。

Views文件夾:用於存放視圖。

有了上面創建的列子。這對筆者相當好的一件事情。光看上面的項目結構筆者至少知道一件事情。MVC中的V就在對應的Views文件夾裡面,而C就在Controllers文件夾裡面。這對我們來講很重要。接下來就是要明白M-V-C之間是什麼樣子工作。我們就可以學習到Asp.NET MVC。Struts2在啟動的時候會去載入對應的配置文件。當然對於Asp.NET MVC來講,也有對應的這項工作。只是載入的東西不同而以。如下。

Global.asax:

 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();
        }
    }

上面的代碼是在Global.asax文件裡面的。那麼筆者為什麼要哪出來講呢?這就是開始初始化Asp.NET MVC的地方。上面的總做了幾件事情呢?

1.註冊WebApi。對於WebApi是什麼。不知道大家有沒有用過RESTful 框架。可惜只是瞭解而以。

2.註冊過濾器。對JAVA開發人員來講,不知道過濾器。那就有一點過份了。

3.註冊路由器。這個很重要。Struts2是什麼樣子通過請求的URL來找到對應的Action類。沒有錯。一定是通過struts.xml配置文件的action節點。路由器就是相當於action節點的功能了。

4.註冊Bundle信息。關於Bundle是什麼筆者也不好說。只知道他是用於UI界面引入CSS和JS。這個時候可以把多個CSS和JS綁成一起。只要引一個Bundle的URL就是把這個些CSS和JS一起引入。

5.註冊證書。關於這個的話。請讀者們自行查看。反正筆者沒有用到過。所以不敢說。

從上面我們知道一件事情——請求的URL是通過路由器來分析找到對應的控制器。所以學習Asp.NET MVC就必須瞭解一下路由器是什麼樣子工作的。讓我們到App_Start文件夾裡面去找一個叫RouteConfig的類。如下

 1 public class RouteConfig
 2     {
 3         public static void RegisterRoutes(RouteCollection routes)
 4         {
 5             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 6 
 7             routes.MapRoute(
 8                 name: "Default",
 9                 url: "{controller}/{action}/{id}",
10                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
11             );
12         }
13     }

上面便是配置路由器的地方。我們可以看到路由器事實是一種以設置URL模板來處理對應的URL請求。上面是每一個Asp.NET MVC都會提供的預設的URL模板。

name:當前路由器的名稱。

url:URL模板。

defaults:URL請求的預設值。

這裡跟Struts2的作法是不一樣子。Struts2在處理URL請求是通對的package節點的名字和action節點的名字來確定對應的action類,再通過action節點配置信息來執行對應的方法。而Asp.NET MVC是通過路由器來分析,並找出對應的控制器和控制器裡面的方法。什麼樣子講呢?讓我看一下上面url的值。

"{controller}/{action}/{id}"

上面就是URL模板。假設用戶請求http://xxx.xx.com.cn/aomi/index/7。通過上面的模板對應一下。我們就可以知道controller值為aomi,action值為index,id值為7。這裡id是一個可選的傳值。什麼說呢?看到id = UrlParameter.Optional了嗎?就是跟我們講id是可選的。所以嚴格來講action節點的功能跟Asp.NET MVC的控制器是對應的。都是用於控制業務結束之後要顯示的視圖。並差別是控制器是一個類。讓我們看一下控制器的代碼吧。這樣子可以加強理解。

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

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

            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

我們可以知道HomeController類繼承了Controller類。是不是說繼承Controller類就可以了。顯然不是,筆者試著把HomeController後面的Controller去掉,發現根本找不到控制器。說明瞭Asp.NET MVC還是有一個約定——控制器要按XxxController來命名。難道就不可以讓開發人員自己來定義名字嗎?筆者沒有說不行。只是有一點煩麻。他要用到控制器工廠。即是IControllerFactory。所以筆者還是希望大家能老實一點吧。struts2在業務結束之後。會返回一個字元串結果來確定要去呈顯的視圖。struts2的視圖卻有幾種。同樣子Asp.NET MVC他也有若幹個返回結果。

EmptyResult:返回一個空的結果。即是返回值為void。

ContentResult:返回一個文本內容的結果。

JsonResult:返回一個JSON格式的結果。

ViewResult:返回一個視圖的結果。即是類似於HTML文件。

上面筆者並沒有全部列出來。其他的話,筆者希望讀者們自己去查看。好了。讓我們看一下上面代碼部分中有一個View()的方法。這個返回的是一個ViewResult型類。上面只是調用View()。這個時候他會用方法名來確定對應的視圖。比如index方法被調用。那麼View()就會到Views文件夾下的Home文件夾去找Index.cshtml。那麼為什麼是Home文件夾呢?預設就是如果XxxController的話,就是View/Xxx下麵找對應的視圖。那麼對於cshtml文件是什麼呢?你可以理解為跟ftl文件是一個類型的。同時在Views文件玩夾下有一個叫Shared文件夾。如下。

本來每一個控制器在Views文件夾都會有一個對應的文件夾。文件夾名跟控制器的名字一樣子。那麼有沒有共用的呢?沒有錯。Shared文件夾就是用於所有控制器供用的。現在只有一個問題了——使用其他的視圖。看一下下麵的圖片。

如果我們調用Index方法。按道理我們要去調用Index.cshtml。那麼如果要調用Aomi.cshtml什麼辦。如下就可以了。

 public class Home:Controller
    {
        public ActionResult Index()
        {
            return View("Aomi");
        }
    }

我們都知道了控制器是如何去找視圖之後。我們要去瞭解一下View到Controller的傳值和Controller到View的傳值。

一、View到Controller的傳值。一般有倆種。一種是用模型對象來傳。一種是KEY-VALUE來傳值。但是一定要確保表單元素的Name要跟參數命名對應。即是相同。

二、Controller到View的傳值。一般有三種。用ViewBag傳值。用Model傳值。即是模型對象。還有用ViewData。

筆者增加了一個方法Aomi。然後參數為name。並通過動態類型ViewBag傳到視圖上。並顯示出來。

控制器:

 public class Home:Controller
    {
        public ActionResult Index()
        {
            return View("Aomi");
        }

        public ActionResult Aomi(string name)
        {
            ViewBag.Name = name;
            return View("Aomi");
        }
    }

視圖:

@{
    ViewBag.Title = "Aomi";
}

<h2>@ViewBag.Name</h2>

執行結果:

註意:name一定要跟參數的命名相同。不然傳不了。

筆者簡單的講解了一下關於傳值的問題。現在我們要來看一下視圖上所用的知識。Asp.NET MVC的視圖一般都是用razor引擎。所以學習razor語法很重要。網路上關於razor語法很多。筆者就不多說。筆者簡單的講一個例子。

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View("Aomi");
        }

        public ActionResult Aomi(string name)
        {
            ViewBag.Name = name;
            return View("Aomi");
        }
        public ActionResult Show()
        {
            ViewBag.DataList = new List<string>() { "a", "b", "c" };
            return View();
        }
    }

Show.cshtml:

@{
    ViewBag.Title = "Show";
}

@foreach (string val in ViewBag.DataList)
{
    <b>@val</b> 
}

執行結果:

其實學習Asp.NET MVC並不難。只要掌握以幾點,筆者相信企業開發就沒有什麼大問題。

1.瞭解一下路由器的用法。

2.View和Controller之間是如何傳值的。

3.Controller是如何確定View的。

4.最後就是學習razor語法。

本章總結

本章主要是瞭解一下Asp.NET MVC。講解路由器和視圖與控制之間傳值。可以說這是重點。那麼本系列就到這裡了。本系列的目地不是為了教學。而是一個引導。是筆者當年學習C#時候的一個過程。最後謝謝大家。


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

-Advertisement-
Play Games
更多相關文章
  • 文檔目錄 本節內容: 簡介 關於 IAuditingStore 配置 通過特性啟用/禁用 註意 關於 IAuditingStore 簡介 維基百科:“一個審計追蹤(也叫審計日誌)是一個安全相關的時序記錄、記錄組、和/或記錄源和目標,作為任何時候一個特殊操作帶來影響的一序列活動的書面文件”。 ABP提 ...
  • 前言: 最近園子里ABP炒的火熱。看了幾篇對於ABP的介紹後,深感其設計精巧,實現優雅。個人感覺,ABP或ABP衍生品的架構設計,未來會成為中型Net項目的首選架構模式。如果您還不瞭解ABP是什麼,有什麼特色,請移步:《ABP集合帖》——http://www.cnblogs.com/kebinet/ ...
  • 有時候我們在做第三人稱游戲的時候,想讓相機平滑的跟隨物體移動,下麵這些代碼就能很快達到這個效果 ...
  • ...
  • 文檔目錄 本節內容: 簡介 關於 IFeatureValueStore 功能類型 Boolean 功能 Value 功能 定義功能 基本功能屬性 其它功能屬性 功能層次 檢查功能 使用RequiresFeature特性 RequiresFeature特性註意事項 使用 IFeatureChecker ...
  • UEditor For ASP.Net Core Use Qiniu 此項目為UEditor提供文件管理; 後端服務使用 ASP.Net Core; 使用七牛提供的雲存儲; 項目地址 http://git.oschina.net/joesjiang/BaiduEditorUseQiniu.NetCo ...
  • 列印一個介面、方法的運行時間在程式中是很容易遇到的一件事情;現在,我就分享一個我在工作中使用的臨時列印日誌的方法和結合 Stopwatch 列印測量某個時間間隔的運行時間的方法。 Stopwatch 實例可以很好的測量一個時間間隔的運行時間;以下例子是比較常用到的: 引用命名空間: using Sy ...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; //本人英語不太好,嘿嘿。。 //其實介面多繼承和單繼承的形式是一樣的。 //博客里介面單繼承,單繼承會了,看這個就很輕鬆了 n ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...