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

. Partial Views使用的简单例子

. 注入服务到View中

. Controller输出数据方法和Filters Attribute的贴图

. IOptions<T>注入自定义读取的配置文件数据信息服务

下面一步一个脚印的来分享:

. Partial Views使用的简单例子

首先,这个局部视图Partial Views在实际项目中用途很多很广,其实这个和前面mvc版本的用法差不多,这里简单举例怎么传递参数和异步布局的用法;咋们先在Shared文件夹中创建一个视图名称为_ShowListLi.cshtml,然后删除里面的所有代码(也就是变成空白的模板),再简单在里面写入代码:

 <li>@Model</li>

挺简单的哈哈@Model对应的就是传递过来的参数,然后咋们创建个Controller对应返回一些列表数据这里我使用前面章节现成的ArticlesController对应的代码:

 public async Task<IActionResult> Index( int id = )
{ var artiles = _context.Article;
var pageOption = new MoPagerOption
{
CurrentPage = id,
PageSize = ,
Total = await artiles.CountAsync(),
RouteUrl = "/Articles/Index"
}; //分页参数
ViewBag.PagerOption = pageOption; ViewBag.Plugin = _plugins.Value; //数据
return View(await artiles.OrderByDescending(b => b.CreateTime).Skip((pageOption.CurrentPage - ) * pageOption.PageSize).Take(pageOption.PageSize).ToListAsync());
}

可以不用关心上面的这个Controller代码,因为是前面已经讲过的,然后在对应的View中写入如下代码:

 <ul>
@foreach (var item in Model)
{
@await Html.PartialAsync("_ShowListLi", item.Title)
}
</ul>

运行的效果展示出了对应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,如下代码:

  public class PublicClass
{ public string _SubStrByLen(string org, int len = , string endStr = "...")
{ try
{
if (string.IsNullOrEmpty(org)) { return org; } //var gb = System.Text.Encoding.UTF8.GetBytes(org);
//var tLen = gb.Length; org = org.Trim();
var tLen = org.Length;
return tLen > len ? (org.Substring(, len) + endStr) : org;
}
catch (Exception ex)
{ throw new Exception(ex.Message);
}
}
}

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

 //注入依赖
services.AddTransient<Extend.PublicClass>();

此时注入完成,然后在试图中使用,这里咋们在上面创建的局部试图_ShowListLi.cshtml文件中使用如下代码:

 @inject Text.Core.Extend.PublicClass PTool

 <li>@Model</li>
<li>@PTool._SubStrByLen(Model,,".....")</li>

试图中使用@inject引入被注入的服务(引入的格式如:@inject <type> <name>),然后使用_SubStrByLen来截取咋们的数据长度,效果如下图:

咋们再继续增加一个静态方法来对比下,方法和上面截图字符串的服务是一样的,如代码:

 public class PublicClassStatic
{ public static string _SubStrByLen(string org, int len = , string endStr = "...")
{ try
{
if (string.IsNullOrEmpty(org)) { return org; } //var gb = System.Text.Encoding.UTF8.GetBytes(org);
//var tLen = gb.Length; org = org.Trim();
var tLen = org.Length;
return tLen > len ? (org.Substring(, len) + endStr) : org;
}
catch (Exception ex)
{ throw new Exception(ex.Message);
}
} }

因为是静态方法,所以可以直接在试图中使用如:

咋们再来看下运行的效果:

可以看出效果是一样的,就写代码速度上来将后者更快些,当然注入服务的方式在页面使用也不无道理因为不可能所有的服务方法都弄成静态的吧,这里的列子只是简单的截取字符串的效果

. 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"
}
}
]
}

再创建一个对应数据格式的实体类:

 public class Plugin
{ public string Module { get; set; }
public string Des { get; set; }
}

好咋们来读取这个配置文件信息到实体对象中,还记得前面几篇有讲到怎么获取配置文件数据么,这里我们使用ConfigurationBuilder读取配置文件,因为起始文件Startup.cs文件中有加载配置文件的操作,所以我们直接在它的构造函数这里添加加载我们刚刚添加的配置文件如下代码:

 var builder = new ConfigurationBuilder()

                 //env.ContentRootPath:获取当前项目的跟路径
.SetBasePath(env.ContentRootPath)
//使用AddJsonFile方法把项目中的appsettings.json配置文件加载进来,后面的reloadOnChange顾名思义就是文件如果改动就重新加载
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
//这里关注的是$"{param}"的这种写法,有点类似于string.Format()
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddJsonFile("Plugin.json", optional: true, reloadOnChange: true);

是的使用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; }

这里循环中每次创建了Plugin对象并赋值了,但是没有集合来保存这些对象数据,这里就要讲到用IOptions<T>注入这些数据到Controller中去,注入关键代码:

 services.AddOptions();

             //初始化参数信息
services.Configure<List<Plugin>>(b =>
{ 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;
b.Add(plugin);
}
});

仔细看下这里注入的数据类型是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>

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

这样就完成了读取自定义配置文件到程序中,然后通过注入就可以在Controller使用了

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

NET Core-学习笔记(四)的更多相关文章

  1. .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]

    原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...

  2. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  3. .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...

  4. .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...

  5. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  6. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  7. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]

    原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...

  10. .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...

随机推荐

  1. NodeJs之pm2

    pm2 pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能. 开发过程中建议时不时的参看官方详细命令行使用:命令行 pm2 ...

  2. 【AR实验室】ARToolKit之Example篇

    0x00 - 前言 PS : 我突然意识到ARToolKit本质可能就是一个可以实时求解相机内外参的解决方案. 拿到一个新的SDK,90%的人应该都会先跑一下Example.拿到ARToolKit的S ...

  3. Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合

    今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...

  4. HTML 事件(二) 事件的注册与注销

    本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...

  5. Linux常用指令指南,终端装逼利器

    最近搞了台Macbook Pro,就学习了一下Linux命令,在网上查了些资料,看了本书叫<快乐的 Linux 命令行>,里面涉及到了各个方面的命令. 在此将常用的整理出来,以备将来使用. ...

  6. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  7. Java定时任务的常用实现

    Java的定时任务有以下几种常用的实现方式: 1)Timer 2)ScheduledThreadPoolExecutor 3)Spring中集成Cron Quartz 接下来依次介绍这几类具体实现的方 ...

  8. JAVA构造时成员初始化的陷阱

    让我们先来看两个类:Base和Derived类.注意其中的whenAmISet成员变量,和方法preProcess(). 情景1:(子类无构造方法) class Base { Base() { pre ...

  9. Ubuntu搭建lnmp环境

    1.安装nginx 安装 sudo apt-get install nginx 服务启动.停止.重启 /etc/init.d/nginx start /usr/sbin/nginx -c /etc/n ...

  10. VC中的MFC到底是什么?

    1. 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API ...