日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器...

發(fā)布時間:2024/9/27 asp.net 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0.前言

在之前的幾篇中,我們大概介紹了如何創(chuàng)建一個http://asp.net core mvc項目以及http請求如何被路由轉交給對應的執(zhí)行單元。這一篇我們將介紹一下控制器與視圖直接的關系。

1. 視圖

這里的視圖不是數(shù)據(jù)庫里的視圖,是一種展示技術。在http://asp.net core mvc項目中視圖是指以cshtml做擴展名的文件,通常在Views文件夾。

那么現(xiàn)在我們進到之前創(chuàng)建的測試項目 MvcWeb的Views目錄下,如果小伙伴們沒有做修改的話,能看到如下的目錄結構:

├── Home │ ├── Index.cshtml │ └── Privacy.cshtml ├── Shared │ ├── Error.cshtml │ ├── _Layout.cshtml │ └── _ValidationScriptsPartial.cshtml ├── _ViewImports.cshtml └── _ViewStart.cshtml

在Views根目錄下,有兩個文件分別是:_ViewImports.cshtml 、_ViewStart.cshtml 兩個文件(注意,有個前置下劃線)。

1.1 在視圖中引用命名空間

我們知道,在cshtml文件中,雖然極大的減少了服務器代碼,但是有時候無法避免的使用一些C#代碼。那么就會產(chǎn)生一個問題,很多類都有自己的命名空間,如果我們在某個或某幾個或某些視圖中需要訪問這些類和方法,那么一個視圖一個視圖的寫引用有點不太現(xiàn)實,因為這太繁瑣了。

所以http://asp.net core mvc 設置了在名為_ViewImports.cshtml的文件中添加引用,則在Views下所有視圖中都生效。那么,先來看看這個文件里有啥吧:

@using MvcWeb @using MvcWeb.Models @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

可以看到,這里引用了項目的命名空間和項目下Modes命名空間的所有內(nèi)容。因為我們之前創(chuàng)建的測試項目名稱就是 MvcWeb。

最后一行是一個 cshtml標記引用,第一個星號表示當前項目的所有TagHelper實現(xiàn)都引用,后面的表示引入http://aps.net core mvc內(nèi)置的TagHelper。

關于 TagHelper,這篇就先不介紹了。

1.2 ViewsStart

_ViewStart.cshtml 作用從名字中可見一二,這個文件用來配置一些在視圖剛開始加載時的一些配置內(nèi)容。先看一下,默認的里面是什么吧:

@{Layout = "_Layout"; }

先做個介紹,@符號后面用一對大括號包裹,里面是C# 代碼。也就是說 Layout = "_Layout",這行的意思是給某個名為Layout的屬性設置值為_Layout。

那么,Layout的屬性是哪里的呢?

對于http://asp.net core mvc而言,一個視圖也是一個類只不過這個類是動態(tài)生成的,不是一個由程序員編寫出來的類,但是這個類繼承自:

namespace Microsoft.AspNetCore.Mvc.Razor {public abstract class RazorPageBase : IRazorPage{} }

Layout正好是這個類的一個屬性,表示視圖是否使用了某個布局頁。所以上面的代碼表示,Views里的新建視圖,默認是使用名為_Layout的視圖作為布局頁。

當然,這個頁面不只有這個作用,小伙伴們可以自己嘗試下哦。

1.3 視圖檢索

在上一節(jié)中,我們指定了一個布局頁的名稱。布局頁也是視圖中的一種,但我們也只指定了名稱,但沒有指定路徑。http://asp.net core是如何發(fā)現(xiàn)這個名稱的視圖呢?

http://asp.net core 會按照以下順序查找對應的視圖文件:

  • Views/[ControllerName]/[ViewName].cshtml
  • Views/Shared/[ViewName].cshtml

所以,_Layout也會按照這個順序查找,為了避免不必要的混淆,我們只在Shared目錄下寫了_Layout.cshtml。這也是通常的做法,該文件表示一個全局的布局頁。

2. 控制器與視圖的關系

在上一篇《【http://asp.net core 系列】2 控制器與路由的恩怨情仇》中,我們介紹了三種創(chuàng)建控制器的方法,并且最后推薦使用名字以Controller結尾并繼承Controller類的寫法。我將在這里為大家再次講解為什么推薦這樣寫:

  • 以Controller結尾,可以很明確的告訴其他人或者未來的自己這是一個控制器,不是別的類
  • 繼承Controller,是因為Controller類為我們提供了控制器用到的屬性和方法

嗯,暫時就這兩點。別看少,但是這很重要。

2.1 使用視圖

在之前介紹的時候,有提到過當我們訪問一個URL的時候,路由會自動為我們尋找到對應的可執(zhí)行代碼單元。但是,沒有進一步內(nèi)容的介紹。當我們尋找到對應的可執(zhí)行代碼單元也就是Action之后,Action進行一系列的處理,會對這個請求做出響應。有一種響應就是返回一個展示頁面,也就是View。

那么,如何返回一個View呢?

創(chuàng)建一個控制器,名為ViewDemoController,并添加一個方法Index,返回類型為IActionResult:

using Microsoft.AspNetCore.Mvc;namespace MvcWeb.Controllers {public class ViewDemoController:Controller{public IActionResult Index(){return View();}} }

其中 View() 表示返回一個View,這View的名稱是 Index,在ViewDemo控制器下。所以,它的路徑應該是:

Views/ViewDemo/Index.cshtml

在對應目錄創(chuàng)建該文件,然后在文件里隨便寫一些內(nèi)容,之后啟動項目(項目的端口在第一部分就已經(jīng)修改過了):

http://localhost:5006

然后訪問:

http://localhost:5006/ViewDemo/

應該是類似的頁面。

IActionResult 是一個接口,表示是一個Action的處理結果,在這里可以理解為固定寫法。

2.2 指定視圖

在控制器里,View 方法表示使用一個視圖進行渲染,默認是使用方法同名的視圖。當然,既然是默認的,那就一定有不默認的時候。對的,View方法提供了幾個重載版本,這些重載版本里有一個名字為viewName的參數(shù),這個參數(shù)就是用來指定視圖名稱的。

那么,我們可以指定哪些視圖名稱:

  • 同一個控制器文件夾下的其他視圖
  • Shared 文件夾下的視圖

這兩種都是不用攜帶路徑的視圖名,可以省略文件擴展名(cshtml)。

當然,還可以指定其他路徑下的視圖文件,如:

  • Views/Home/About.cshtml表示從根目錄下查找到這個視圖,這種寫法必須指定擴展名
  • ../Manage/Index 表示在Manage控制器目錄下的Index

2.3 給視圖傳遞數(shù)據(jù)

之前介紹了如何使用視圖、如何指定視圖名稱,但是還缺最關鍵的一步,那就是如何給視圖傳遞數(shù)據(jù)。

通常情況下,Action方法中給視圖傳遞數(shù)據(jù),只有這三種是推薦的:

  • 使用ViewData
  • 使用ViewDataAttribute
  • 使用ViewBag
  • 使用ViewModel

Controller類有一個屬性是 ViewData,它的聲明如下:

public ViewDataDictionary ViewData { get; set; }

可以看到這是一個字典型的屬性,所以給它賦值是這樣使用的:

public IActionResult Index() {ViewData["Title"] = "ViewDemo";return View(); }

ViewBag也是 Controller類的一個屬性,它的聲明如下:

public dynamic ViewBag { get; }

可以看到這是一個動態(tài)類,實際上ViewBag里的數(shù)據(jù)與ViewData是互通的,換句話說就是ViewBag是對ViewData的一次封裝,兩者并沒有實際上的區(qū)別。賦值使用:

public IActionResult Index() {ViewBag.Name = "小李";return View(); }

而ViewDataAttribute則與上兩個,不太一樣,這個屬性標注給控制器的屬性上,http://asp.net core mvc就會把這個屬性的值填充給ViewData,鍵值就是屬性名:

[ViewData] public string AttributeTest{get;set;}

與 ViewData["AttributeTest"]效果一致。

在View方法的一些重載版本里,需要一個名為 model的參數(shù),類型是object。這個參數(shù)就是一個ViewModel。使用:

在MvcWeb/Models 下添加一個類:

namespace MvcWeb.Models {public class ViewModelTestModel{public string Name{get;set;}public int Age{get;set;}} }

回到剛剛的Index方法里,創(chuàng)建一個ViewModelTestModel實例,并傳給View方法:

public IActionResult Index() {ViewData["Title"] = "ViewDemo";ViewBag.Name = "小李";var model = new ViewModelTestModel{Name = "測試實例",Age = 1};return View(model); }

2.4 在視圖中使用

在上一小節(jié)中,我們分別使用ViewData和ViewBag以及ViewModel給視圖傳遞了三個數(shù)據(jù),那么如何在視圖中獲取這三個數(shù)據(jù)呢?

<h2>@ViewData["Title"]</h2> <!--實際會顯示 <h2>ViewDemo</h2>-->

與字典一樣,@起頭,表示后面跟著一個屬性或者一段C#表達式,并將表達式的結果輸出到頁面上。

ViewBag的訪問與ViewData類似,只不過ViewBag是動態(tài)對象,可以認為它的類型并沒有發(fā)生改變,繼續(xù)按照之前的類型進行使用:

<h4>@ViewBag.Name</h4>

對于ViewModel的使用,View內(nèi)置了一個dynamic的Model屬性,在不做特殊處理的情況下,我們在頁面上使用@Model 會得到一個dynamic對象(如果傳了ViewModel的話)。雖然也能用,但是這不太友好。

這時候,就需要我們在視圖的開頭處,添加:

@model ViewModelTestModel

這時候,再使用@Model的時候,就會自動解析成ViewModelTestModel了。

整體Index.cshtml內(nèi)容如下:

@model ViewModelTestModel Hello World! <h2>@ViewData["Title"]</h2><h4>@ViewBag.Name</h4> @Model.Name + @Model.Age

然后重啟服務后,刷新頁面,會看到類似的內(nèi)容:

3. 總結

我們在這一篇介紹了視圖的一些概念,并介紹了如何使用控制器給視圖傳遞數(shù)據(jù)。下一篇將講解一下路由的高級作用,如何通過路由攜帶數(shù)據(jù)。

更多內(nèi)容煩請關注我的博客《高先生小屋》

總結

以上是生活随笔為你收集整理的.ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。