From 7969c88796e799e4b22a983f45f166bc5dae523a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=B6=9B?= Date: Mon, 15 Apr 2019 15:27:38 +0800 Subject: [PATCH 1/5] Improve Chinese translation of ASP.NET Core MVC Tutorial - Part I --- .../Tutorials/AspNetCore-Mvc/Part-I.md | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md index 19d278e563..fd29fdc7fe 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md @@ -24,7 +24,7 @@ ### 创建Book实体 -在 **领域层** 定义[实体](../../Entities.md)(`Acme.BookStore.Domain` 中).这个项目最主要的实体就是`Book`: +在 **领域层** 定义[实体](../../Entities.md)(`Acme.BookStore.Domain` 项目中).这个项目最主要的实体就是`Book`: ````C# using System; @@ -50,14 +50,14 @@ namespace Acme.BookStore } ```` -* ABP有两个基本的实体基类: `AggregateRoot` 和 `Entity`.**Aggregate Root**是 **领域驱动设计(DDD)** 中的概念.查看[实体](../../Entities.md)的更多信息和最佳实践. -* `Book`实体继承了`AuditedAggregateRoot`,`AuditedAggregateRoot`类在`AggregateRoot`类的基础上添加了(`CreationTime`, `CreatorId`, `LastModificationTime`... 等.)审计属性. -* `Book`实体的主键类型是`Guid`类型. +* ABP有两个基本的实体基类: `AggregateRoot` 和 `Entity`.**Aggregate Root**是 **领域驱动设计(DDD)** 的概念之一.更多信息和最佳实践请查看[实体文档](../../Entities.md). +* `Book`实体继承了`AuditedAggregateRoot`,`AuditedAggregateRoot`类在`AggregateRoot`类的基础上添加了一些审计属性(`CreationTime`, `CreatorId`, `LastModificationTime`... 等.). +* `Guid`是`Book`实体的主键类型. * 使用 **数据注解** 为EF Core添加映射.或者你也可以使用 EF Core 自带的[fluent mapping API](https://docs.microsoft.com/en-us/ef/core/modeling). #### BookType枚举 -下面是所有要用到的`BookType`枚举: +上面所用到的`BookType`枚举定义如下: ````C# namespace Acme.BookStore @@ -79,19 +79,19 @@ namespace Acme.BookStore #### 将Book实体添加到DbContext中 -EF Core需要你将实体和DbContext建立关联.最简单的做法是在`Acme.BookStore.EntityFrameworkCore`项目的`BookStoreDbContext`类中添加`DbSet`属性.如: +EF Core需要你将实体和DbContext建立关联.最简单的做法是在`Acme.BookStore.EntityFrameworkCore`项目的`BookStoreDbContext`类中添加`DbSet`属性.如下所示: ````C# public class BookStoreDbContext : AbpDbContext { - public DbSet Book { get; set; } + public DbSet Books { get; set; } ... } ```` #### 添加新的Migration并更新数据库 -这个启动模板使用了[EF Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/)来创建并维护数据库结构.打开 **Package Manager Console (PMC)** (工具/Nuget包管理器菜单),选择 `Acme.BookStore.EntityFrameworkCore.DbMigrations`作为默认的项目然后执行下面的命令: +这个启动模板使用了[EF Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/)来创建并维护数据库结构.打开 **程序包管理器控制台(Package Manager Console) (PMC)** (工具/Nuget包管理器菜单),选择 `Acme.BookStore.EntityFrameworkCore.DbMigrations`作为默认的项目然后执行下面的命令: ![bookstore-pmc-add-book-migration](images/bookstore-pmc-add-book-migration-v2.png) @@ -136,10 +136,10 @@ namespace Acme.BookStore } ```` -* **DTO**类被用来在 **基础设施层** 和 **应用层** **传递数据**.查看[DTO文档](../../Data-Transfer-Objects.md)查看更多信息. -* 为了在页面上展示书籍信息,`BookDto`被用来将书籍数据传递到基础设施层. +* **DTO**类被用来在 **表示层** 和 **应用层** **传递数据**.查看[DTO文档](../../Data-Transfer-Objects.md)查看更多信息. +* 为了在页面上展示书籍信息,`BookDto`被用来将书籍数据传递到表示层. * `BookDto`继承自 `AuditedEntityDto`.跟上面定义的`Book`类一样具有一些审计属性. -* `[AutoMapFrom(typeof(Book))]`用来创建从`Book`类到`BookDto`的映射.使用这种方法.你可以将`Book`对象自动转换成`BookDto`对象(而不是手动复制所有的属性). +* `[AutoMapFrom(typeof(Book))]`用来创建从`Book`类到`BookDto`的AutoMapper映射.使用这种方法.你可以将`Book`对象自动转换成`BookDto`对象(而不是手动复制所有的属性). #### CreateUpdateBookDto @@ -171,7 +171,7 @@ namespace Acme.BookStore } ```` -* 这个DTO类在创建和更新书籍的时候被使用,用来从页面获取图书信息. +* 这个DTO类被用于在创建或更新书籍的时候从用户界面获取图书信息. * 类中的属性定义了数据注解(如`[Required]`)用来定义有效性验证.ABP会自动校验DTO的数据有效性. #### IBookAppService @@ -191,14 +191,14 @@ namespace Acme.BookStore Guid, //Book实体的主键 PagedAndSortedResultRequestDto, //获取书籍的时候用于分页和排序 CreateUpdateBookDto, //用于创建书籍 - CreateUpdateBookDto> //用户更新书籍 + CreateUpdateBookDto> //用于更新书籍 { } } ```` -* 为应用服务定义接口不是必须的,不过,我们推荐这么做. +* 为应用服务定义接口不是必须的,不过,这是推荐的最佳实践. * `IAsyncCrudAppService`中定义了基础的 **CRUD**方法:`GetAsync`, `GetListAsync`, `CreateAsync`, `UpdateAsync` 和 `DeleteAsync`.不需要扩展它.取而代之,你可以继承空的`IApplicationService`接口定义你自己的方法. * `IAsyncCrudAppService`有一些变体,你可以为每一个方法使用单个或者多个的DTO.(译者注:意思是类似EntityDto和UpdateEntityDto可以用同一个,也可以分别单独指定 ) @@ -231,14 +231,14 @@ namespace Acme.BookStore ```` * `BookAppService`继承了`AsyncCrudAppService<...>`.`AsyncCrudAppService<...>`实现了上面定义的CRUD方法. -* `BookAppService`注入了`IRepository`,`IRepository`是默认为`Book`创建的仓储.ABP会自动为每一个聚合根(或实体)创建仓储.参考[仓储](../../Repositories.md). -* `BookAppService`使用了 `IObjectMapper` 将`Book`转换成`BookDto`,将`CreateUpdateBookDto`转换成`Book`.启动模板中使用了[AutoMapper](http://automapper.org/)作为映射工具.你可以像上面那样使用`AutoMapFrom` 和 `AutoMapTo`定义映射.查看[AutoMapper继承](../../AutoMapper-Integration.md)获取更多信息. +* `BookAppService`注入了`IRepository`,`IRepository`是默认为`Book`创建的仓储.ABP会自动为每一个聚合根(或实体)创建仓储.参考[仓储文档](../../Repositories.md). +* `BookAppService`使用了 `IObjectMapper` 将`Book`转换成`BookDto`,将`CreateUpdateBookDto`转换成`Book`.启动模板中使用了[AutoMapper](http://automapper.org/)作为对象映射提供程序.你可以像上面那样使用`AutoMapFrom` 和 `AutoMapTo`定义映射.查看[AutoMapper集成文档](../../AutoMapper-Integration.md)获取更多信息. ### 自动生成API Controllers 你通常需要创建 **Controllers** 将应用服务暴露为 **HTTP API**.这样浏览器或第三方客户端可以通过AJAX的方式访问它们. -ABP可以 **自动地** (../../AspNetCore/Auto-API-Controllers.md)将应用服务转换成MVC API Controllers. +ABP可以通过约定 **自动地** (../../AspNetCore/Auto-API-Controllers.md)将应用服务转换成MVC API Controllers. #### Swagger UI @@ -250,13 +250,13 @@ ABP可以 **自动地** (../../AspNetCore/Auto-API-Controllers.md)将应用服 ### 动态JavaScript代理 -通过AJAX的方式调用HTTP API接口是很常见的,你可以使用`$.ajax`或这其他的工具来调用接口.当然,ABP中提供了更好的方式. +在Javascript端通过AJAX的方式调用HTTP API接口是很常见的,你可以使用`$.ajax`或这其他的工具来调用接口.当然,ABP中提供了更好的方式. ABP **自动** 为所有的API接口创建了JavaScript **代理**.因此,你可以像调用 **JavaScript function**一样调用任何接口. #### 在浏览器的开发者控制台中测试接口 -你可以使用你最爱的浏览器的 **开发者控制台** 中轻松测试JavaScript代理.运行程序,并打开浏览器的 **开发者工具**(快捷键:F12),切换到 **Console**,输入下面的代码并回车: +你可以使用你钟爱的浏览器的 **开发者控制台** 中轻松测试JavaScript代理.运行程序,并打开浏览器的 **开发者工具**(快捷键:F12),切换到 **Console** 标签,输入下面的代码并回车: ````js acme.bookStore.book.getList({}).done(function (result) { console.log(result); }); @@ -265,14 +265,14 @@ acme.bookStore.book.getList({}).done(function (result) { console.log(result); }) * `acme.bookStore`是`BookAppService`的命名空间,转换成了[驼峰命名](https://en.wikipedia.org/wiki/Camel_case). * `book`是`BookAppService`转换后的名字(去除了AppService后缀并转成了驼峰命名). * `getList`是定义在`AsyncCrudAppService`基类中的`GetListAsync`方法转换后的名字(去除了Async后缀并转成了驼峰命名). -* `{}`参数用来传递一个空的对象给`GetListAsync`方法.GetListAsync期望的参数是`PagedAndSortedResultRequestDto`类型,`PagedAndSortedResultRequestDto`类型中定义了分页和排序. +* `{}`参数用来传递一个空的对象给`GetListAsync`方法.GetListAsync期望的参数是`PagedAndSortedResultRequestDto`类型的对象,`PagedAndSortedResultRequestDto`类型中定义了分页和排序选项. * `getList`方法返回了一个`promise`.因此,你可以传递一个回调函数到`done`(或者`then`)方法中来获取服务返回的结果. 运行这段代码会产生下面的输出: ![bookstore-test-js-proxy-getlist](images/bookstore-test-js-proxy-getlist.png) -你可以看到服务器返回的 **book list**.你还可以切换到开发者工具的 **network** 查看客户端和服务器的连接: +你可以看到服务器返回的 **book list**.你还可以切换到开发者工具的 **network** 查看客户端到服务器端的通讯信息: ![bookstore-test-js-proxy-getlist-network](images/bookstore-test-js-proxy-getlist-network.png) @@ -292,10 +292,10 @@ successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7 ### 创建书籍页面 -现在我们来创建一些可见的可用的东西,我们使用[Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start)代替经典的MVC.微软也推荐使用Razor Pages UI +现在我们来创建一些可见和可用的东西,取代经典的MVC,我们使用微软推荐的[Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start). -在 `Acme.BookStore.Web`项目的`Pages`文件夹下创建一个新的文件夹叫`Books`并添加一个名叫`Index.cshtml`的Razor Page. +在 `Acme.BookStore.Web`项目的`Pages`文件夹下创建一个新的文件夹叫`Books`并添加一个名为`Index.cshtml`的Razor Page. ![bookstore-add-index-page](images/bookstore-add-index-page.png) @@ -310,7 +310,7 @@ successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7

Books

```` -* 改变Razor View Page Model默认的继承,使页面的 **inherits** 来自`BookStorePageBase`类(代替`PageModel`).`BookStorePageBase`类来自启动模板并提供了一些公开的属性/方法,这些属性/方法可以被所有的页面使用. +* 修改Razor View Page Model的默认继承,使页面 **继承** 自`BookStorePageBase`类(代替`PageModel`).`BookStorePageBase`类来自于启动模板,它提供了一些公开的可以被所有的页面使用的属性/方法. #### 将Books页面添加到主菜单 @@ -349,11 +349,11 @@ context.Menu.AddItem( ![bookstore-menu-items](images/bookstore-menu-items.png) -点击菜单就会调转到新增书籍的页面. +点击Books菜单项就会跳转到新增的书籍页面. #### 书籍列表 -我们会在页面上使用JQuery插件[Datatables.net](https://datatables.net/)来展示列表.Datatables可以完全通过AJAX工作,所以它很快而且有良好的用户体验.启动模板中已经配置好了Datatables,因此你可以在你的页面中直接使用,不需要引用样式和脚本文件. +我们会在页面上使用JQuery插件[Datatables.net](https://datatables.net/)来展示列表.Datatables可以完全通过AJAX工作,所以它很快而且有良好的用户体验.启动模板中已经配置好了Datatables插件,因此你可以在你的页面中直接使用,不需要引用样式和脚本文件. ##### 修改Index.cshtml @@ -388,7 +388,7 @@ context.Menu.AddItem( ```` -* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro)可以将添加外部的 **scripts**添加到页面中.它比标准的`script`标签多了很多额外的功能.它可以处理 **最小化**和 **版本**.查看[bundling & minification 文档](../../AspNetCore/Bundling-Minification.md)获取更多信息. +* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro)用于将外部的 **脚本** 添加到页面中.它比标准的`script`标签多了很多额外的功能.它可以处理 **最小化**和 **版本**.查看[捆绑 & 压缩文档](../../AspNetCore/Bundling-Minification.md)获取更多信息. * `abp-card` 和 `abp-table` 是为Twitter Bootstrap的[card component](http://getbootstrap.com/docs/4.1/components/card/)封装的 **tag helpers**.ABP中有很多tag helpers,可以很方便的使用大多数[bootstrap](https://getbootstrap.com/)组件.你也可以使用原生的HTML标签代替tag helpers.使用tag helper可以通过智能提示和编译时类型检查减少HTML代码并防止错误.查看[tag helpers 文档](../../AspNetCore/Tag-Helpers.md). * 你可以像上面本地化菜单一样 **本地化** 列名. From eac5cf5f8dbfc41d57a18c6c497e968ca9b8cea0 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 15 Apr 2019 11:41:42 +0300 Subject: [PATCH 2/5] Added Volo.Abp.Cli package. --- framework/Volo.Abp.sln | 9 ++++++++- framework/src/Volo.Abp.Cli/Program.cs | 12 ++++++++++++ framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj | 12 ++++++++++++ nupkg/common.ps1 | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.Cli/Program.cs create mode 100644 framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 9814829086..eb04229f94 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -217,7 +217,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Features.Tests", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp", "src\Volo.Abp\Volo.Abp.csproj", "{6C161F55-54B6-42A5-B177-3B0ED50323C1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Authentication.JwtBearer", "src\Volo.Abp.AspNetCore.Authentication.JwtBearer\Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj", "{46C6336C-A1D8-4858-98CE-6F4C698C5A77}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Authentication.JwtBearer", "src\Volo.Abp.AspNetCore.Authentication.JwtBearer\Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj", "{46C6336C-A1D8-4858-98CE-6F4C698C5A77}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Cli", "src\Volo.Abp.Cli\Volo.Abp.Cli.csproj", "{69168816-4394-4DDA-BB6B-C21983D37F0B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -649,6 +651,10 @@ Global {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Debug|Any CPU.Build.0 = Debug|Any CPU {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|Any CPU.ActiveCfg = Release|Any CPU {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|Any CPU.Build.0 = Release|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -760,6 +766,7 @@ Global {575BEFA1-19C2-49B1-8D31-B5D4472328DE} = {447C8A77-E5F0-4538-8687-7383196D04EA} {6C161F55-54B6-42A5-B177-3B0ED50323C1} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {46C6336C-A1D8-4858-98CE-6F4C698C5A77} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {69168816-4394-4DDA-BB6B-C21983D37F0B} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.Cli/Program.cs b/framework/src/Volo.Abp.Cli/Program.cs new file mode 100644 index 0000000000..5e9dcd4006 --- /dev/null +++ b/framework/src/Volo.Abp.Cli/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace Volo.Abp.Cli +{ + public class Program + { + private static void Main(string[] args) + { + Console.WriteLine("Welcome to ABP CLI..! This tool is in development. There is no functionality yet. So, bye bye... ;)"); + } + } +} diff --git a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj new file mode 100644 index 0000000000..29b80cb98a --- /dev/null +++ b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj @@ -0,0 +1,12 @@ + + + + + + Exe + netcoreapp2.2 + true + abp + + + diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index 6e44b4ce66..e83acaa57c 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -53,6 +53,7 @@ $projects = ( "framework/src/Volo.Abp.BackgroundWorkers", "framework/src/Volo.Abp.Caching", "framework/src/Volo.Abp.Castle.Core", + "framework/src/Volo.Abp.Cli", "framework/src/Volo.Abp.Core", "framework/src/Volo.Abp.Data", "framework/src/Volo.Abp.Ddd.Application", From 657fd77b48cab56b9983ca1f08933505b2b7c8f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=B6=9B?= Date: Mon, 15 Apr 2019 17:27:51 +0800 Subject: [PATCH 3/5] Improve Chinese translation of ASP.NET Core MVC Tutorial - Part II & III --- .../Tutorials/AspNetCore-Mvc/Part-II.md | 20 +++++++++---------- .../Tutorials/AspNetCore-Mvc/Part-III.md | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md index a7334030a6..9e54ac7a2f 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md @@ -53,9 +53,9 @@ namespace Acme.BookStore.Pages.Books } ```` -* 这个类继承了 `BookStorePageModelBase` 而非默认的 `PageModel`. `BookStorePageModelBase` 继承了 `PageModel` 并且添加了一些Razor页面模型通用的属性和方法. -* 该类在 `Book` 属性上标记的 `[BindProperty]` 特性绑定了post请求提交上来的数据. -* 该类通过构造函数注入了 `IBookAppService` 应用服务,并且在 `OnPostAsync` 方法中调用了服务的 `CreateAsync` 方法. +* 该类派生于 `BookStorePageModelBase` 而非默认的 `PageModel`. `BookStorePageModelBase` 继承了 `PageModel` 并且添加了一些可以被你的page model类使用的通用属性和方法. +* `Book` 属性上的 `[BindProperty]` 特性将post请求提交上来的数据绑定到该属性上. +* 该类通过构造函数注入了 `IBookAppService` 应用服务,并且在 `OnPostAsync` 处理程序中调用了服务的 `CreateAsync` 方法. ##### CreateModal.cshtml @@ -82,7 +82,7 @@ namespace Acme.BookStore.Pages.Books * 这个 modal 使用 `abp-dynamic-form` Tag Helper 根据 `CreateBookViewModel` 类自动构建了表单. * `abp-model` 指定了 `Book` 属性为模型对象. - * `data-ajaxForm` 设置了表单通过AJAX提交. + * `data-ajaxForm` 设置了表单通过AJAX提交,而不是经典的页面回发. * `abp-form-content` tag helper 作为表单控件渲染位置的占位符 (这是可选的,只有你在 `abp-dynamic-form` 中像本示例这样添加了其他内容才需要). #### 添加 "New book" 按钮 @@ -211,7 +211,7 @@ namespace Acme.BookStore } ```` -* 仅仅是添加 `[AutoMapFrom(typeof(BookDto))]` 特性就可以创建上述映射关系. +* 仅添加 `[AutoMapFrom(typeof(BookDto))]` 特性就可以创建上述映射关系. #### EditModal.cshtml @@ -238,9 +238,9 @@ namespace Acme.BookStore ```` -除了以下几点,这个页面内容和 `CreateModal.cshtml` 非常相似: +这个页面内容和 `CreateModal.cshtml` 非常相似,除了以下几点: -* 此页面包含了一个 `abp-input` 以保存所编辑book实体的 `Id` 属性. +* 此页面包含了一个 `abp-input` 以保存所编辑book实体的 `Id` 属性值. * 此页面指定的post地址是 `Books/EditModal` ,并用文本 *Update* 作为 modal 标题. #### 为表格添加 "操作(Actions)" 下拉菜单 @@ -325,8 +325,8 @@ $(function () { ```` * 通过 `abp.localization.getResource('BookStore')` 可以在客户端使用服务器端定义的相同的本地化语言文本. -* 定义 `editModal` 为 `ModalManager` 来打开编辑用的 modal 对话框. -* 在 `columnDefs` 起始处新增一列作为 "Actions" 下拉按钮. +* 添加了一个名为 `editModal` 的新的 `ModalManager` 来打开编辑用的 modal 对话框. +* 在 `columnDefs` 起始处新增一列用于显示 "Actions" 下拉按钮. * "Edit" 操作只是简单调用 `editModal.open` 来打开编辑对话框. 现在,你可以运行程序,通过编辑操作来更新任一个book实体. @@ -354,7 +354,7 @@ $(function () { * `confirmMessage` 用来在实际执行 `action` 之前向用户进行确认. * 通过javascript代理方法 `acme.bookStore.book.delete` 执行一个AJAX请求来删除一个book实体. -* `abp.notify.info` 用来提示用户操作成功. +* `abp.notify.info` 用来在执行删除操作后显示一个toastr通知信息. 最终的 `index.js` 文件内容如下所示: diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md index 0514c8fc1a..80c28acc91 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md @@ -58,7 +58,7 @@ namespace Acme.BookStore } ```` -* 这里直接使用了identity模块实现的 `IIdentityDataSeeder` 接口,创建了一个admin角色和admin用户.你同样可以在你的测试代码中直接使用这些代码. +* 这里直接使用了identity模块实现的 `IIdentityDataSeeder` 接口,创建了一个admin角色和admin用户.你可以在测试代码中使用它们. * 你可以在 `BuildInternalAsync` 方法中添加你自己的测试数据. 按下方所示修改 `BookStoreTestDataBuilder` 类: From 7ff94ca74acf14c2b757d5d354e2df450ac3e5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=B6=9B?= Date: Tue, 16 Apr 2019 10:50:58 +0800 Subject: [PATCH 4/5] Update abp UI localization text of pt-BR and zh-Hans --- .../src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json | 3 ++- .../src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json index 54c573857a..67d6fa7d3c 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json @@ -45,6 +45,7 @@ "PagerShowMenuEntries": "Mostrando _MENU_ registros", "DatatableActionDropdownDefaultText": "Ações", "ChangePassword": "Alterar Senha", - "PersonalInfo": "Perfil" + "PersonalInfo": "Perfil", + "AreYouSureYouWantToCancelEditingWarningMessage": "Você tem alterações não salvas." } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json index f1814efdb3..8747d1dc8d 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json @@ -45,6 +45,7 @@ "PagerShowMenuEntries": "显示 _MENU_ 实体", "DatatableActionDropdownDefaultText": "操作", "ChangePassword": "修改密码", - "PersonalInfo": "个人信息" + "PersonalInfo": "个人信息", + "AreYouSureYouWantToCancelEditingWarningMessage": "你有未保存的更改." } } From c3dc353755495e90e0b415cc0be617503873419b Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 16 Apr 2019 09:14:35 +0300 Subject: [PATCH 5/5] Update AbpTagHelperService.cs --- .../TagHelpers/AbpTagHelperService.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs index 566cbcffbc..53c56295ce 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs @@ -17,13 +17,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers where TTagHelper : TagHelper { protected const string FormGroupContents = "FormGroupContents"; - protected const string NavItemContents = "FormGroupContents"; protected const string TabItems = "TabItems"; protected const string AccordionItems = "AccordionItems"; protected const string BreadcrumbItemsContent = "BreadcrumbItemsContent"; protected const string CarouselItemsContent = "CarouselItemsContent"; protected const string TabItemsDataTogglePlaceHolder = "{_data_toggle_Placeholder_}"; - protected const string TabItemsVerticalPillPlaceHolder = "{_vertical_pill_Placeholder_}"; protected const string TabItemNamePlaceHolder = "{_Tab_Tag_Name_Placeholder_}"; protected const string AbpFormContentPlaceHolder = "{_AbpFormContentPlaceHolder_}"; protected const string AbpTabItemActivePlaceholder = "{_Tab_Active_Placeholder_}"; @@ -31,9 +29,6 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers protected const string AbpTabItemShowActivePlaceholder = "{_Tab_Show_Active_Placeholder_}"; protected const string AbpBreadcrumbItemActivePlaceholder = "{_Breadcrumb_Active_Placeholder_}"; protected const string AbpCarouselItemActivePlaceholder = "{_CarouselItem_Active_Placeholder_}"; - protected const string AbpNavItemActivePlaceholder = "{_NavItem_Active_Placeholder_}"; - protected const string AbpNavItemResponsiveFlexPlaceholder = "{_NavItem_Responsive_Flex_Placeholder_}"; - protected const string AbpNavItemResponsiveAlignPlaceholder = "{_NavItem_Responsive_Align_Placeholder_}"; protected const string AbpTabItemSelectedPlaceholder = "{_Tab_Selected_Placeholder_}"; protected const string AbpAccordionParentIdPlaceholder = "{_Parent_Accordion_Id_}";