新濠天地 > 编程网新闻 > 下载安装 .NET SDK,用一个小的示例演示了SignalR作

原标题:下载安装 .NET SDK,用一个小的示例演示了SignalR作

浏览次数:59 时间:2019-09-20

上一篇文章基于jTopo的拓扑图设计工具库ujtopo,介绍了拓扑设计工具,这一篇我们使用SignalR2结合ujtopo实现拓扑图的动态变化。

Asp.Net Core 是开源,跨平台,模块化,快速而简单的Web框架.

Asp.net Core官网的一个合集,方便一次性Clone

目录

  • 快速入门
  • 安装
  • 一个最小的应用
  • 项目模板
  • 路由
  • 静态文件
  • 页面渲染
  • 请求
  • 错误和重定向
  • 关于响应
  • 会话
  • 日志
  • 配置
  • 国际化

持续更新,也可以通过我的网站访问,欢迎探讨交流

仅仅作为演示,之前的文章SignalR2简易数据看板演示,用一个小的示例演示了SignalR作为数据看板的用法,这次我们将这个例子稍微改变一下,当点击的时候,数据还是加1,当为奇数时,改变其中一个结点的图片,当为偶数时,再把这个结点的图片改变为另一张图片;以此为基础,可以延伸出很多应用。

快速入门

软件环境:VS2015

安装

下载安装 .NET SDK

查看dotnet sdk 版本

$ dotnet --version`
2.1.4

创建项目目录

$ mkdir study
$ cd study

使用 dotnet new 命令创建项目

$ dotnet new console -n Demo
$ cd Demo

在 VS Code中打开Demo文件夹

使用VS2015创建.net Framework4.5的Web应用程序,选择MVC,身份认证选择不需要身份验证。

一个最小的应用

打开 Program.cs

using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseStartup<Startup>()
                .Build();
            host.Run();
        }
    }

    class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync("Hello, World!");
            });
        }
    }
}

安装相关的Nuget包

$ dotnet add package Microsoft.AspNetCore.Hosting --version 2.0.1
$ dotnet add package Microsoft.AspNetCore.Server.Kestrel --version 2.0.1

下载依赖项

$ dotnet restore

运行

$ dotnet run

输出结果:

Hosting environment: Production
Content root path: C:netcorestudyDemobinDebugnetcoreapp2.0
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

Nuget包,选择AdminLTE,选择安装,版本是最新的2.4.0。

项目模板

根据指定的模板,创建新的项目、配置文件或解决方案。

$ dotnet new -h
使用情况: new [选项]

选项:
  -h, --help          显示有关此命令的帮助。
  -l, --list          列出包含指定名称的模板。如果未指定名称,请列出所有模板。
  -n, --name          正在创建输出的名称。如果未指定任何名称,将使用当前目录的名                                                                                                                                                                                               称。
  -o, --output        要放置生成的输出的位置。
  -i, --install       安装源或模板包。
  -u, --uninstall     卸载一个源或模板包。
  --type              基于可用的类型筛选模板。预定义的值为 "project"、"item" 或                                                                                                                                                                                                "other"。
  --force             强制生成内容,即使该内容会更改现有文件。
  -lang, --language   指定要创建的模板的语言。

模板                                                短名称              语言                                                                                                                                                                                                               标记
--------------------------------------------------------------------------------                                                                                                                                                                                               ------------------------
Console Application                               console          [C#], F#, VB                                                                                                                                                                                                     Common/Console
Class library                                     classlib         [C#], F#, VB                                                                                                                                                                                                     Common/Library
Unit Test Project                                 mstest           [C#], F#, VB                                                                                                                                                                                                     Test/MSTest
xUnit Test Project                                xunit            [C#], F#, VB                                                                                                                                                                                                     Test/xUnit
ASP.NET Core Empty                                web              [C#], F#                                                                                                                                                                                                         Web/Empty
ASP.NET Core Web App (Model-View-Controller)      mvc              [C#], F#                                                                                                                                                                                                         Web/MVC
ASP.NET Core Web App                              razor            [C#]                                                                                                                                                                                                             Web/MVC/Razor Pages
ASP.NET Core with Angular                         angular          [C#]                                                                                                                                                                                                             Web/MVC/SPA
ASP.NET Core with React.js                        react            [C#]                                                                                                                                                                                                             Web/MVC/SPA
ASP.NET Core with React.js and Redux              reactredux       [C#]                                                                                                                                                                                                             Web/MVC/SPA
ASP.NET Core Web API                              webapi           [C#], F#                                                                                                                                                                                                         Web/WebAPI
global.json file                                  globaljson                                                                                                                                                                                                                        Config
NuGet Config                                      nugetconfig                                                                                                                                                                                                                       Config
Web Config                                        webconfig                                                                                                                                                                                                                         Config
Solution File                                     sln                                                                                                                                                                                                                               Solution
Razor Page                                        page                                                                                                                                                                                                                              Web/ASP.NET
MVC ViewImports                                   viewimports                                                                                                                                                                                                                       Web/ASP.NET
MVC ViewStart                                     viewstart                                                                                                                                                                                                                         Web/ASP.NET

Examples:
    dotnet new mvc --auth Individual
    dotnet new page --namespace
    dotnet new --help

使用dotnet new 选择 console 模板 创建项目

$ dotnet new console -n Demo
$ cd Demo

创建后的项目文档结构是

.
├── Demo
│   ├── Demo.csproj
│   └── Program.cs

Nuget包,选择WebHelpers.Mvc5,选择安装,版本是最新的2.1.0。

路由

SignalR的安装,请参见之前的博文SignalR 2 入门

启用,配置路由

using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;

namespace Demo {

    class Startup {
        public void ConfigureServices (IServiceCollection services) {
            //启用路由
            services.AddRouting ();
        }
        public void Configure (IApplicationBuilder app) {
            //配置路由
            app.UseRouter (routes => {
                //根路由 (/)
                routes.MapGet("", context =>
                {
                    return context.Response.WriteAsync("Hello, World!");
                });
                //在根路由 (/) 上,配置 /hello Get请求的路由
                routes.MapGet ("hello", context => {
                    return context.Response.WriteAsync ("Got a Get request at /hello");
                });
            });
        }
    }
}

安装相关的Nuget包

$ dotnet add package Microsoft.AspNetCore.Routing --version 2.0.1

下载依赖项

$ dotnet restore

运行

$ dotnet run

访问 http://localhost:5000/hello ,输出结果:

Got a Get request at /hello

对 /user 路由的 POST 请求进行响应:

routes.MapPost("hello", context => {
    return context.Response.WriteAsync ("Got a Post request at /hello");
})

对 /user 路由的 PUT 请求进行响应:

routes.MapPut("hello", context => {
    return context.Response.WriteAsync ("Got a Put request at /hello");
})

对 /user 路由的 DELETE 请求进行响应:

routes.MapDelete("hello", context => {
    return context.Response.WriteAsync ("Got a Dlete request at /hello");
})

Designer.cshtml页面跟上篇博文jTopo的拓扑图设计工具库ujtopodesigner.html一样;

静态文件

Index.cshtml页面引入SignalR2

启用,配置静态资源

创建 wwwroot文件夹

$ mkdir wwwroot
$ cd wwwroot

复制 index.html 到 wwwroot目录

$ mkdir images
$ cd images

复制 favicon.png 到 images文件夹下

项目结构图如下:
.
├── Demo
│   ├── wwwroot
│   │   ├── images
│   │   │   ├── favicon.png
│   │   ├── index.html
│   ├── Demo.csproj
│   └── Program.cs

更改 Program.cs,设置ContentRoot路径为当前项目根目录,启用静态资源

using System;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;

namespace Demo {
    class Program {
        static void Main (string[] args) {
            Console.WriteLine (AppContext.BaseDirectory);
            var host = new WebHostBuilder ()
                .UseKestrel ()
                //设置 ContentRoot, ContentRoot是任何资源的根路径,比如页面和静态资源
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .Build ();
            host.Run ();
        }
    }

    class Startup {
        public void Configure (IApplicationBuilder app) {
            //使用静态资源,默认的目录是 /wwwroot
            app.UseStaticFiles ();
        }
    }
}

运行

http://localhost:5000/index.html

http://localhost:5000vicon.png

@Scripts.Render("~/Bundles/ujtopo")    <script src="@Url.Content("~/Scripts/jquery.signalR-2.4.0.min.js")"></script>    <script src="@Url.Content("~/signalr/hubs")" type="text/javascript"></script>

Bundles/ujtopo使用Bundle压缩了ujtopo相关的js

bundles.Add(new ScriptBundle("~/Bundles/ujtopo")                .Include("~/Content/js/plugins/jTopo/jtopo-0.4.8-min.js")                .Include("~/Content/js/plugins/jTopo/toolbar.js")                .Include("~/Content/js/plugins/ujtopo/ujtopo.js"));

配置其他文件夹

新建文件夹myfiles

$ mkdir myfiles
$ cd myfiles

创建一个新的 index.html到myfiles文件夹,配置并使用myfiles文件夹

app.UseStaticFiles (new StaticFileOptions {
    FileProvider = new PhysicalFileProvider (
            Path.Combine (Directory.GetCurrentDirectory (), "myfiles")),
        RequestPath = "/myfiles"
});

运行

http://localhost:5000/myfiles/index.html

其它的代码同上篇博文jTopo的拓扑图设计工具库ujtopo中的index.html一样;topo初始化之后连接SignalR。

页面渲染

var startConn = function () {            var connection = $.hubConnection();            var hub = connection.createHubProxy("ChartHub");            hub.on("updateChart", function  {                var tmp = chart % 2;                if  {                    var eNode = jtopo.findNode;                    if (eNode != null && eNode != undefined) {                        eNode.setImage(rootUrl + "Images/ujtopo/net-yuan.png", true);                    }                }                else {                    var eNode = jtopo.findNode;                    if (eNode != null && eNode != undefined) {                        eNode.setImage(rootUrl + "Images/ujtopo/comb-brush-hair-make.png", true);                    }                }            });            connection.start();        }

Razor模板引擎

Asp.net Core自带的模板引擎是 Razor模板引擎,传统的Razor页面以cshtml结尾, 阅读Razor语法
遗憾的是Razor模板引擎在Asp.net Core中封装在了MVC模块之中,需要做一些扩展才可以单独拿出来使用

j_10是指的baby坐浴椅这个节点,因为我们在设计的时候,它的id是10,前面加了前缀j_是因为使用的是uid

创建模板页面

创建 views文件夹

$ mkdir views
$ cd views

创建 index.cshtml 页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <ul>
        @for (int i = 0; i < 5; i++)
        {
            <li>第@(i + 1)行</li>
        }
    </ul>
</body>
</html>
dealArgs = function  {        args.uid = "j_" + args.id;        return args;    },  

使用模板

using System;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(AppContext.BaseDirectory);
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .Build();
            host.Run();
        }
    }

    class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            //启用Mvc
            services.AddMvc();

            //扩展类
            services.AddSingleton<RazorViewRenderer>();

        }
        public void Configure(IApplicationBuilder app)
        {
            app.UseRouter(routes =>
            {
                //根路径 /
                routes.MapGet("", context =>
                {
                    return context.Render("/views/index.cshtml");
                }
            });
        }

    }
}

安装相关的Nuget包

$ dotnet add package Microsoft.AspNetCore.Mvc --version 2.0.2

下载依赖项

$ dotnet restore

运行

$ dotnet run

结果

第1行
第2行
第3行
第4行
第5行

另外,当具有signalr的网站未以根网站运行时,不是使用/signalr,使用../signalr。它适用于任何站点名称文件夹。没有硬编码名称'

渲染数据

新濠天地,新增实体类 UserInfo

public class UserInfo
{
    public string Name { get; set; }
    public int Age { get; set; }
}

新增user.cshtml页面

@using Demo;
@model UserInfo
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <ul>
        <li>姓名:@Model.Name</li>
        <li>年龄:@Model.Age</li>
    </ul>
</body>
</html>

更改Program.cs

app.UseRouter(routes =>
{
    //根路径 /
    routes.MapGet("", context =>
    {
        return context.Render("/views/index.cshtml");
    }
    routes.MapGet("/user", context =>
    {
        return context.Render("/views/user.cshtml", new UserInfo() { Name = "张三", Age = 18 });
    });
});

运行

$ dotnet run

结果

姓名:张三
年龄:18

var connection = $.hubConnection('../signalr', {useDefaultPath: false});

请求数据

QueryString

var queryCollection = context.Request.Query;
foreach (var item in queryCollection)
{
    Console.WriteLine(item.Key + ":" + item.Value);
}

用designer页面设计了拓扑图,在index页面展示

Form

if (context.Request.ContentType.ToLower().Contains("application/x-www-form-urlencoded")
{
    var formCollection = context.Request.Form;
    foreach (var item in formCollection)
    {
        Console.WriteLine(item.Key + ":" + item.Value);
    }
}

新濠天地 1

Files

var fileCollections = context.Request.Form.Files;
var rootPath = context.RequestServices.GetService<IHostingEnvironment>().ContentRootPath;
foreach (var item in fileCollections)
{

    var path = Path.Combine(rootPath,item.FileNa
    using (var stream = new FileStream(path, FileMode.Create))
    {
        await item.CopyToAsync(stream);
    }
    Console.WriteLine(item.FileName + ":" + item.Length);
}
点击之后,变为

Header

var headerCollection = context.Request.Headers;
foreach (var item in headerCollection)
{
    Console.WriteLine(item.Key + ":" + item.Value);
}

新濠天地 2

Body

StreamReader reader = new StreamReader(context.Request.Body);
string text = reader.ReadToEnd();
再次点击之后,变为:

Cookies

var cookieCollection=context.Request.Cookies;
foreach (var item in cookieCollection)
{
    Console.WriteLine(item.Key + ":" + item.Value);
}

新濠天地 3

错误和重定向

GitHub:

重定向

context.Response.Redirect("path")

文章同步在

状态代码页

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.IO;
using System.Text.Encodings.Web;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(AppContext.BaseDirectory);
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .Build();
            host.Run();
        }
    }

    class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            //启用路由
            services.AddRouting();
            services.AddMvc();
            services.AddSingleton<RazorViewRenderer>();

        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //启用状态码页
            app.UseStatusCodePages();

            app.UseRouter(routes =>
            {
                //根路径 /
                routes.MapGet("", context =>
                {
                    return context.Render("/views/index.cshtml");
                }
            });
        }

    }
}

演示地址:

自定义状态码页

新增 404.cshtml

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <h1> Oops! Page Not Found ! </h1>
</body>
</html>

配置和使用自定义的状态码页

app.UseStatusCodePagesWithRedirects("/status/{0}");

app.UseRouter(routes =>
{
    //""
    routes.MapGet("", context =>
    {
        return context.Response.WriteAsync("root path");
    });

    routes.MapGet("status/{code}", (request, response, routeData) =>
    {
        var statusCodePagesFeature = request.HttpContext.Features.Get<IStatusCodePagesFeature>();
        var code = routeData.Values["code"];
        if (statusCodePagesFeature != null && code!=null && code.ToString() == "404")
        {
            //跳转到自定义的404页面
            return request.HttpContext.Render("/views/404.cshtml");
        }
        else
        {
            return response.WriteAsync(HtmlEncoder.Default.Encode("状态码:"+ routeData.Values["code"]));
        }
    });
});

异常错误页

开发异常页面,Asp.net Core自带

app.UseDeveloperExceptionPage();

新增测试路由,抛出空指针异常

env.EnvironmentName = EnvironmentName.Development;
if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/error");
}

app.UseRouter(routes =>
{
    //""
    routes.MapGet("", context =>
    {
        return context.Response.WriteAsync("root path");
    }

    //test
    routes.MapGet("test", context =>
    {
        throw new Exception("空指针异常!!!");
    });
});

访问http://localhost:57393/test,得到下面的页面
新濠天地 4

自定义异常页面

env.EnvironmentName = EnvironmentName.Production;
if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    //自定义异常错误页面
    app.UseExceptionHandler("/error");
}

app.UseRouter(routes =>
{
    //""
    routes.MapGet("", context =>
    {
        return context.Response.WriteAsync("root path");
    }

    //test
    routes.MapGet("test", context =>
    {
        throw new Exception("空指针异常!!!");
    });

    //自定义异常错误页面
    routes.MapGet("error", context =>
    {
        context.Response.StatusCode = 500;
        context.Response.ContentType = "text/html";
        var error = context.Features.Get<IExceptionHandlerFeature>();
        if (error != null)
        {
            return context.Response.WriteAsync("<h1>" + HtmlEncoder.Default.Encode("发生了错误: " + error.Error.Messa + "</h1>");
        }
        else
        {
            return context.Response.WriteAsync("<h1>" + HtmlEncoder.Default.Encode("Oops! 发生了错误,请联系管理员")"</h1>");
        }
    });
});

关于响应

会话

Session

新增登陆页面login.cshtml

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <form action="/login" method="post">
        <div>
            <label>用户名:</label>
            <input  type="text" name="UserName" />
        </div>
        <div>
            <label>密码:</label>
            <input type="password" name="PassWord" />
        </div>
        <div>
            <input type="submit" value="登陆" />
        </div>
    </form>
</body>
</html>

添加并启用Session,输入用户名和密码,点击登陆,保持Session数据,登陆成功跳转到/home路由页面,访问Session数据,显示当前登陆的用户名

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.IO;
using System.Threading.Tasks;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(AppContext.BaseDirectory);
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .Build();
            host.Run();
        }
    }

    class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            //启用路由
            services.AddRouting();
            services.AddMvc();
            services.AddSingleton<RazorViewRenderer>();
            //增加Session
            services.AddSession();
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseDeveloperExceptionPage();

            // 启用Session
            app.UseSession();

            app.UseRouter(routes =>
            {
                routes.MapGet("", (request, response, routeData) =>
                {
                    return request.HttpContext.Render("/views/login.cshtml");
                });

                routes.MapGet("home", context =>
                {
                    string userName = context.Session.GetString("userName");
                    if (!string.IsNullOrEmpty(userName))
                    {
                        return context.Response.WriteAsync("User:" + userName);
                    }
                    else
                    {
                        context.Response.Redirect("/");
                        return Task.CompletedTask;
                    }
                });

                routes.MapPost("login", context =>
                {
                    var userName = context.Request.Form["UserName"].ToString();
                    var password = context.Request.Form["PassWord"].ToString();
                    if (userName.Equals("admin") && password.Equals("123456"))
                    {
                        context.Session.SetString("userName", password);
                        context.Response.Redirect("/home");
                        return Task.CompletedTask;
                    }
                    else
                    {
                        throw new Exception("用户名或密码错误");
                    }
                });


            });
        }

    }
}

日志

安装Nuget包

$ dotnet add package Microsoft.Extensions.Logging --version 2.0.0
$ dotnet add package Microsoft.Extensions.Logging.Console --version 2.0.0

下载依赖项

$ dotnet restore

添加日志模块

//启用日志
services.AddLogging(builder=> {
    //使用控制台日志提供程序
    builder.AddConsole();
});

创建ILogger实例

var logger = context.RequestServices.GetService<ILogger<Startup>> ();
//记录日志
logger.LogInformation("before hello world");

日志分类

日志的类别,可以是任意字符串,默认是完全限定的类名,例如: Demo.Startup

日志级别

logger.LogTrace();
logger.LogDebug();
logger.LogInformation();
logger.LogWarning();
logger.LogError();
logger.LogCritical();

日志过滤

给日志分类为 Demo.Startup的日志类别限定最小的日志级别是LogLevel.Information

services.AddLogging(builder=> {
    builder.AddFilter("Demo.Startup", LogLevel.Information);
    builder.AddConsole();
});

访问更多关于日志类别,级别,模板,过滤,作用域的说明日志类别

配置

  • 添加配置
    ```c#
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Routing;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Threading.Tasks;

namespace Demo
{
class Program
{
static void Main(string[] args)
{
var configBuilder = new ConfigurationBuilder();
configBuilder.AddInMemoryCollection(new Dictionary

        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseConfiguration(config)
            .UseStartup<Startup>()
            .Build();
        host.Run();
    }
}

}
-- 读取配置c#
app.UseRouter(routes =>
{
routes.MapGet("", context =>
{
var config = context.RequestServices.GetService

## 国际化

-- 添加依赖的Nuget包

$ dotnet add package Microsoft.Extensions.Localization --version 2.0.1

下载依赖项

$ dotnet restore
```

资源文件命名规则

命名规则 {分类名称}.{语言区域名称}.resx

  • 分类名称:默认的分类名称就是类型的FullName,在AssemblyName后的相对路径,比如Demo.Startup,程序集的名称Demo,就剩下了Startup
  • 语言区域名称: 语言区域名称有zh-CN,en-US,更多.aspx)

特殊条件下你也可以将资源文件和类定义文件放在同一个目录,这样资源文件的分类名称就是{类名称}.{语言区域名称}.resx

添加资源文件

  • 新建 myresources文件夹
  • 新建 Startup.en-US.resx 新增项 name是sayhi,value是 HelloWorld
  • 新建 Startup.zh-CN.resx 新增项 name是sayhi,value是 世界你好

    ### 添加本地化

    services.AddLocalization(options =>
    options.ResourcesPath = "myresources";
    });
    

    ### 启用本地化

    var cultureList = new List<CultureInfo>() {
         new CultureInfo("en-US"),
         new CultureInfo("zh-CN")
    };
    var options = new RequestLocalizationOptions()
    {
    SupportedCultures = cultureList,
    SupportedUICultures = cultureList,
    DefaultRequestCulture = new RequestCulture("zh-CN")
    };
    //新建基于Query String的多语言提供程序
    var provider = new QueryStringRequestCultureProvider();
    provider.QueryStringKey = "culture";
    provider.UIQueryStringKey = "uiculture";
    //删除所有多语言提供程序
    options.RequestCultureProviders.Clear();
    options.RequestCultureProviders.Add(provider);
    

    ### 资源文件读取

    var stringLocalizer = context.RequestServices.GetService<IStringLocalizer<Startup>>();
    string sayhi = stringLocalizer["sayhi"];
    

    访问 http://localhost:57393/?culture=en-US 切换为英文版本,默认的语言是中文

    ### 多语言提供程序

  • 通过Query String,[默认自带]

  • 通过Cookie,[默认自带]
  • 通过Accept-Language header,[默认自带]
  • 通过RouteData

    ### 模板格式化

    string username="张三";
    string localizedString = _localizer["Hello {0}!", username];
    

    ###

本文由新濠天地发布于编程网新闻,转载请注明出处:下载安装 .NET SDK,用一个小的示例演示了SignalR作

关键词:

上一篇:新濠天地//包含这两个GDI+单元,//包含这两个GD

下一篇:新濠天地Qashqai语言绘图:ROC曲线图