## ASP.NET Core MVC Tutorial - Part II ### About the Tutorial In this tutorial series, you will build an application that is used to manage a list of books & their authors. **Entity Framework Core** (EF Core) will be used as the ORM provider (as it comes pre-configured with the startup template). This is the second part of the tutorial series. See all parts: * [Part I: Create the project and a book list page](Part-I.md) * **Part II: Create, Update and Delete books (this tutorial)** * [Part III: Integration Tests](Part-III.md) You can download the **source code** of the application [from here](https://github.com/volosoft/abp/tree/master/samples/BookStore). ### Creating a New Book In this section, you will learn how to create a new modal dialog form to create a new book. The result dialog will be like that: ![bookstore-create-dialog](../../images/bookstore-create-dialog.png) #### Create the Modal Form Create a new razor page, named `CreateModal.cshtml` under the `Pages/Books` folder of the `Acme.BookStore.Web` project: ![bookstore-add-create-dialog](../../images/bookstore-add-create-dialog.png) ##### CreateModal.cshtml.cs Open the `CreateModal.cshtml.cs` file (`CreateModalModel` class) and replace with the following code: ````C# using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; namespace Acme.BookStore.Pages.Books { public class CreateModalModel : AbpPageModel { [BindProperty] public CreateUpdateBookDto Book { get; set; } private readonly IBookAppService _bookAppService; public CreateModalModel(IBookAppService bookAppService) { _bookAppService = bookAppService; } public async Task OnPostAsync() { await _bookAppService.CreateAsync(Book); return NoContent(); } } } ```` * `[BindProperty]` attribute on the `Book` property binds post request data to this property. * This class simply injects the `IBookAppService` in its constructor and calls the `CreateAsync` method in the `OnPostAsync` handler. ##### CreateModal.cshtml Open the `CreateModal.cshtml` file and paste the code below: ````html @page @inherits Acme.BookStore.Pages.BookStorePageBase @using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal @model Acme.BookStore.Pages.Books.CreateModalModel @{ Layout = null; } ```` * This modal uses `abp-dynamic-form` tag helper to automatically create the form from the `CreateBookViewModel` class. * `abp-model` attribute indicates the model object, the `Book` in this case. * `data-ajaxForm` attribute makes the form to submit via AJAX, instead of classic page post. * `abp-form-content` tag helper is a placeholder to render the form. This is optional and needed only if you added some other content in the `abp-dynamic-form` tag. #### Add the "New book" Button Open the `Pages/Books/Index.cshtml` and change the `abp-card-header` tag as shown below: ````html

@L["Books"]

```` Just added a **New book** button to the **top right** of the table: ![bookstore-new-book-button](../../images/bookstore-new-book-button.png) Open the `wwwroot/pages/books/index.js` and add the following code just after the datatable configuration: ````js var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); createModal.onResult(function () { dataTable.ajax.reload(); }); $('#NewBookButton').click(function (e) { e.preventDefault(); createModal.open(); }); ```` * `abp.ModalManager` is a helper class to open and manage modals in the client side. It internally uses Twitter Bootstrap's standard modal, but abstracts many details by providing a simple API. Now, you can **run the application** and add new books using the new modal form. ### Updating An Existing Book TODO...