NET Core-学习笔记(四)

简介: 经过前面分享的三篇netcore心得再加上本篇分享的知识,netcore大部分常用知识应该差不多了,接下来将不会按照章节整合一起分享,因为涉及到的东西整合到一起篇幅太大了,所以后面分享将会按照某一个知识点分解,还请各位勿喷;本章要分享的信息如下: .

经过前面分享的三篇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使用了

这次的分享怎么样,望勿喷,后面分享的文章可能就专注某个知识点,不会一篇讲太分散的知识了,希望各位朋友多多支持,谢谢。

 

 

目录
相关文章
|
27天前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
77 3
|
17天前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
3月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
47 0
|
3月前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
104 0
|
3月前
|
开发框架 监控 .NET
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
|
3月前
|
Linux C# C++
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
|
3月前
|
开发框架 .NET API
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
140 0