文章出處

經過前面分享的三篇netcore心得再加上本篇分享的知識,netcore大部分常用知識應該差不多了,接下來將不會按照章節整合一起分享,因為涉及到的東西整合到一起篇幅太大了,所以后面分享將會按照某一個知識點分解,還請各位勿噴;本章要分享的信息如下:

. Partial Views使用的簡單例子

. 注入服務到View中

. Controller輸出數據方法和Filters Attribute的貼圖

. IOptions<T>注入自定義讀取的配置文件數據信息服務

 

下面一步一個腳印的來分享:

. Partial Views使用的簡單例子

首先,這個局部視圖Partial Views在實際項目中用途很多很廣,其實這個和前面mvc版本的用法差不多,這里簡單舉例怎么傳遞參數和異步布局的用法;咋們先在Shared文件夾中創建一個視圖名稱為_ShowListLi.cshtml,然后刪除里面的所有代碼(也就是變成空白的模板),再簡單在里面寫入代碼:

1 <li>@Model</li>
View Code

挺簡單的哈哈@Model對應的就是傳遞過來的參數,然后咋們創建個Controller對應返回一些列表數據這里我使用前面章節現成的ArticlesController對應的代碼:

 1 public async Task<IActionResult> Index( int id = 1)
 2         {
 3 
 4             var artiles = _context.Article;
 5             var pageOption = new MoPagerOption
 6             {
 7                 CurrentPage = id,
 8                 PageSize = 2,
 9                 Total = await artiles.CountAsync(),
10                 RouteUrl = "/Articles/Index"
11             };
12 
13             //分頁參數
14             ViewBag.PagerOption = pageOption;
15 
16             ViewBag.Plugin = _plugins.Value;
17 
18             //數據
19             return View(await artiles.OrderByDescending(b => b.CreateTime).Skip((pageOption.CurrentPage - 1) * pageOption.PageSize).Take(pageOption.PageSize).ToListAsync());
20         }
View Code

可以不用關心上面的這個Controller代碼,因為是前面已經講過的,然后在對應的View中寫入如下代碼:

1 <ul>
2     @foreach (var item in Model)
3     {
4         @await Html.PartialAsync("_ShowListLi", item.Title)
5     }
6 </ul>
View Code

運行的效果展示出了對應Title的數據如圖:

PartialAsync是一種調用局部布局試圖的方法,兩個參數,第一個是局部試圖文件的名稱這里是_ShowListLi,第二個參數是要傳遞給引入的局部試圖的參數這里我使用列表數據中的Title;因為這是個異步方法前面按照慣例需要await修飾代碼就是這些,需要注意的是第一個參數如果局部試圖文件是在項目中的不同文件夾中引用的路徑不相同,這里給出一段官網的代碼加上翻譯的文字說明(不要太在意譯文的準確性):

//使用當前對應文件夾中名稱為ViewName文件的布局試圖
//如果同級文件夾中不存在ViewName那么去項目中的Shared文件夾中查找布局視圖
@Html.Partial("ViewName")

//如果是完整的布局視圖名稱加后綴如:ViewName.cshtml"),那么只能查找使用布局視圖文件所在的對應文件夾中是否存在本試圖
@Html.Partial("ViewName.cshtml")

//從項目根目錄查找布局視圖
@Html.Partial("~/Views/Folder/ViewName.cshtml")
@Html.Partial("/Views/Folder/ViewName.cshtml")

//使用相對路徑查找試圖文件
@Html.Partial("../Account/LoginPartial.cshtml")

 

. 注入服務到View中

首先,咋們定義一個服務類PublicClass和一個截取字符串方法_SubStrByLen,如下代碼:

 1  public class PublicClass
 2     {
 3 
 4         public string _SubStrByLen(string org, int len = 50, string endStr = "...")
 5         {
 6 
 7             try
 8             {
 9                 if (string.IsNullOrEmpty(org)) { return org; }
10 
11                 //var gb = System.Text.Encoding.UTF8.GetBytes(org);
12                 //var tLen = gb.Length;
13 
14                 org = org.Trim();
15                 var tLen = org.Length;
16                 return tLen > len ? (org.Substring(0, len) + endStr) : org;
17             }
18             catch (Exception ex)
19             {
20 
21                 throw new Exception(ex.Message);
22             }
23         }
24     }
View Code

然后,在文件Startup.cs中的ConfigureServices方法中使用AddTransient添加注入:

1 //注入依賴
2             services.AddTransient<Extend.PublicClass>();
View Code

此時注入完成,然后在試圖中使用,這里咋們在上面創建的局部試圖_ShowListLi.cshtml文件中使用如下代碼:

1 @inject Text.Core.Extend.PublicClass PTool
2 
3 <li>@Model</li>
4 <li>@PTool._SubStrByLen(Model,10,".....")</li>
View Code

試圖中使用@inject引入被注入的服務(引入的格式如:@inject <type> <name>),然后使用_SubStrByLen來截取咋們的數據長度,效果如下圖:

咋們再繼續增加一個靜態方法來對比下,方法和上面截圖字符串的服務是一樣的,如代碼:

 1 public class PublicClassStatic
 2     {
 3 
 4         public static string _SubStrByLen(string org, int len = 50, string endStr = "...")
 5         {
 6 
 7             try
 8             {
 9                 if (string.IsNullOrEmpty(org)) { return org; }
10 
11                 //var gb = System.Text.Encoding.UTF8.GetBytes(org);
12                 //var tLen = gb.Length;
13 
14                 org = org.Trim();
15                 var tLen = org.Length;
16                 return tLen > len ? (org.Substring(0, len) + endStr) : org;
17             }
18             catch (Exception ex)
19             {
20 
21                 throw new Exception(ex.Message);
22             }
23         }
24 
25     }
View Code

因為是靜態方法,所以可以直接在試圖中使用如:

咋們再來看下運行的效果:

可以看出效果是一樣的,就寫代碼速度上來將后者更快些,當然注入服務的方式在頁面使用也不無道理因為不可能所有的服務方法都弄成靜態的吧,這里的列子只是簡單的截取字符串的效果

 

. Controller輸出數據方法和Filters Attribute的貼圖

這點主要是截圖Controller里面Action對應的返回數據的方法:

對應的官網地址:https://docs.asp.net/en/latest/mvc/controllers/actions.html

Filters Attribute的貼圖:

對應官網地址:https://docs.asp.net/en/latest/mvc/controllers/filters.html

這兩個知識點會在后面的不斷擴展,歡迎繼續關注

 

. IOptions<T>注入自定義讀取的配置文件數據信息服務

首先,咋們創建一個配置文件Plugin.json,內容數據如:

{
  "Plugins": [

    {
      "Plugin": {

        "Module": "API",
        "Des": "this is API"
      }
    },
    {
      "Plugin": {

        "Module": "MVC",
        "Des": "this is MVC"
      }
    }
  ]
}
View Code

再創建一個對應數據格式的實體類:

 public class Plugin
    {

        public string Module { get; set; }
        public string Des { get; set; }
    }
View Code

好咋們來讀取這個配置文件信息到實體對象中,還記得前面幾篇有講到怎么獲取配置文件數據么,這里我們使用ConfigurationBuilder讀取配置文件,因為起始文件Startup.cs文件中有加載配置文件的操作,所以我們直接在它的構造函數這里添加加載我們剛剛添加的配置文件如下代碼:

1 var builder = new ConfigurationBuilder()
2 
3                 //env.ContentRootPath:獲取當前項目的跟路徑
4                 .SetBasePath(env.ContentRootPath)
5                 //使用AddJsonFile方法把項目中的appsettings.json配置文件加載進來,后面的reloadOnChange顧名思義就是文件如果改動就重新加載
6                 .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
7                 //這里關注的是$"{param}"的這種寫法,有點類似于string.Format()
8                 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
9                 .AddJsonFile("Plugin.json", optional: true, reloadOnChange: true);
View Code

是的使用AddJsonFile方法直接添加我們要讀取的配置文件名稱,這樣在實例對象ConfigurationBuilder調用Build()方法之后配置文件就加載到程序中了,再賦值給了屬性Configuration,此屬性在方法ConfigureServices()可以直接使用,因為配置文件中是一個數組json所以轉到程序中是集合對象,所以有了如下代碼:

 foreach (var item in Configuration.GetSection("Plugins").GetChildren())
                {

                    var plugin = new Plugin();

                    plugin.Module = item.GetSection("Plugin:Module").Value;
                    plugin.Des = item.GetSection("Plugin:Des").Value;
                   
                }
View Code

這里循環中每次創建了Plugin對象并賦值了,但是沒有集合來保存這些對象數據,這里就要講到用IOptions<T>注入這些數據到Controller中去,注入關鍵代碼:

 1 services.AddOptions();
 2 
 3             //初始化參數信息
 4             services.Configure<List<Plugin>>(b =>
 5             {
 6 
 7                 foreach (var item in Configuration.GetSection("Plugins").GetChildren())
 8                 {
 9 
10                     var plugin = new Plugin();
11 
12                     plugin.Module = item.GetSection("Plugin:Module").Value;
13                     plugin.Des = item.GetSection("Plugin:Des").Value;
14                     b.Add(plugin);
15                 }
16             });
View Code

仔細看下這里注入的數據類型是List<Plugin>,這樣就匹配配置文件對應的json數組了;

然后咋們去Controller中代碼如圖:

然后通過_plugins.Value這樣就能得到注入進來的配置文件數據了,咋們再通過ViewBag.Plugin = _plugins.Value保存數據展示到試圖中代碼如:

<table class="table">

    <tbody>
        @foreach (var item in ViewBag.Plugin as List<Plugin>)
        {
            <tr>
                <td>
                    @item.Module
                </td>
                <td>
                    @item.Des
                </td>
            </tr>
        }
    </tbody>
</table>
View Code

dotnet run能看到如下截圖效果:

這樣就完成了讀取自定義配置文件到程序中,然后通過注入就可以在Controller使用了

這次的分享怎么樣,望勿噴,后面分享的文章可能就專注某個知識點,不會一篇講太分散的知識了,希望各位朋友多多支持,謝謝。

 

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()