From 603d17737c916504275d247608a8ea233ec21cd5 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Fri, 29 Jun 2018 10:48:01 +0300 Subject: [PATCH] Added books page. --- docs/Tutorials/AspNetCore-Mvc/Part-I.md | 61 ++++++++++++++++-- docs/images/bookstore-add-index-page.png | Bin 0 -> 8699 bytes docs/images/bookstore-localization-files.png | Bin 0 -> 5416 bytes docs/images/bookstore-menu-items.png | Bin 0 -> 10649 bytes samples/BookStore/Acme.BookStore.sln | 4 +- .../Localization/BookStore/en.json | 2 + .../Localization/BookStore/tr.json | 2 + .../Menus/BookStoreMenuContributor.cs | 5 ++ .../Pages/Books/Index.cshtml | 6 ++ .../Pages/Books/Index.cshtml.cs | 12 ++++ 10 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 docs/images/bookstore-add-index-page.png create mode 100644 docs/images/bookstore-localization-files.png create mode 100644 docs/images/bookstore-menu-items.png create mode 100644 samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml create mode 100644 samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml.cs diff --git a/docs/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/Tutorials/AspNetCore-Mvc/Part-I.md index be915e1d8d..236f87bdaa 100644 --- a/docs/Tutorials/AspNetCore-Mvc/Part-I.md +++ b/docs/Tutorials/AspNetCore-Mvc/Part-I.md @@ -87,7 +87,7 @@ public class BookStoreDbContext : AbpDbContext Startup template uses [EF Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/) to create and maintain the database schema. Open the **Package Manager Console (PMC)**, select the `Acme.BookStore.EntityFrameworkCore` as the **default project** and execute the following command: -![bookstore-pmc-add-book-migration](../../images\bookstore-pmc-add-book-migration.png) +![bookstore-pmc-add-book-migration](../../images/bookstore-pmc-add-book-migration.png) This will create a new migration class inside the `Migrations` folder. Then execute the `Update-Database` command to update the database schema: @@ -99,7 +99,7 @@ PM> Update-Database `Update-Database` command created the `Books` table in the database. Enter a few sample rows, so you can show them on the page: -![bookstore-books-table](../../images\bookstore-books-table.png) +![bookstore-books-table](../../images/bookstore-books-table.png) ### Create the Application Service @@ -215,7 +215,7 @@ acme.bookStore.book.getList({}).done(function (result) { console.log(result); }) Running this code produces such an output: -![bookstore-test-js-proxy-getlist](D:\Github\abp\docs\images\bookstore-test-js-proxy-getlist.png) +![bookstore-test-js-proxy-getlist](../../images/bookstore-test-js-proxy-getlist.png) You can see the **book list** returned from the server. @@ -240,15 +240,66 @@ successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7 Check the `books` table in the database to see the new book row. You can also try `get`, `update` and `delete` functions. -### Create the Book List Page +### Create the Books Page -TODO... +It's time to create something visible! Instead of classic MVC, we will use the new [Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start) approach which is recommended by Microsoft. +Create a new `Books` folder under the `Pages` folder of the `Acme.BookStore.Web` project and add a new Razor Page named `Index.html`: +![bookstore-add-index-page](../../images/bookstore-add-index-page.png) +Open the `Index.cshtml` and change the content as shown below: +````html +@page +@using Acme.BookStore.Pages.Books +@inherits Acme.BookStore.Pages.BookStorePageBase +@model IndexModel +

Books

+```` + +* This page inherits from the `BookStorePageBase` class which comes with the startup template and provides some shared properties/methods used by all pages. + +#### Add Books Page to the Main Menu + +Open the `BookStoreMenuContributor` class in the `Menus` folder and add the following code to the end of the `ConfigureMainMenuAsync` method: + +````c# +context.Menu.AddItem( + new ApplicationMenuItem("BooksStore", l["Menu:BookStore"]) + .AddItem(new ApplicationMenuItem("BooksStore.Books", l["Menu:Books"], url: "/Books")) +); +```` + +#### Localizing the Menu Items + +Localization texts are located under the `Localization/BookStore` folder of the `Acme.BookStore.Domain` project: + +![bookstore-localization-files](../../images/bookstore-localization-files.png) + +Open the `en.json` file and add localization texts for `Menu:BookStore` and `Menu:Books` keys: + +````json +{ + "culture": "en", + "texts": { + //... + "Menu:BookStore": "Book Store", + "Menu:Books": "Books" + } +} +```` + +* ABP's localization system is built on [ASP.NET Core's standard localization](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) system and extends it in many ways. See the [localization document](../../Localization.md) for details. +* Localization key names are arbitrary, you can set any name. We prefer to add `Menu` namespace for menu items to distinguish from other texts. If a text is not defined in the localization file, it **fallbacks** to the localization key (ASP.NET Core's standard behavior). + +Run the application and see the menu items are added to the top bar: +![bookstore-menu-items](../../images/bookstore-menu-items.png) +When you click to the Books menu item, you are redirected to the new Books page. +#### Book List +TODO... \ No newline at end of file diff --git a/docs/images/bookstore-add-index-page.png b/docs/images/bookstore-add-index-page.png new file mode 100644 index 0000000000000000000000000000000000000000..2452ca546eb7c3991102cf1769a0aa81ca5ef221 GIT binary patch literal 8699 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 literal 0 HcmV?d00001 diff --git a/docs/images/bookstore-menu-items.png b/docs/images/bookstore-menu-items.png new file mode 100644 index 0000000000000000000000000000000000000000..255defb707a44532ae8a3a31190394bdf9289e02 GIT binary patch literal 10649 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 x5ob=I^8GLM!vYp)ACMwn_7*pS>(); context.Menu.Items.Insert(0, new ApplicationMenuItem("BookStore.Home", l["Menu:Home"], "/")); + + context.Menu.AddItem( + new ApplicationMenuItem("BooksStore", l["Menu:BookStore"]) + .AddItem(new ApplicationMenuItem("BooksStore.Books", l["Menu:Books"], url: "/Books")) + ); } } } diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml new file mode 100644 index 0000000000..97f9e9b240 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml @@ -0,0 +1,6 @@ +@page +@using Acme.BookStore.Pages.Books +@inherits Acme.BookStore.Pages.BookStorePageBase +@model IndexModel + +

Books

\ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml.cs b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml.cs new file mode 100644 index 0000000000..6bd7bc6dce --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace Acme.BookStore.Pages.Books +{ + public class IndexModel : PageModel + { + public void OnGet() + { + + } + } +} \ No newline at end of file