ASP NET core 2 0 MVC razor pages for beginners how to build a video course website

528 28 0
ASP NET core 2 0 MVC  razor pages for beginners  how to build a video course website

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ASP.NET Core 2.0 MVC & Razor Pages for Beginners How to Build a Video Course Website ASP.NET Core 2.0 MVC For Beginners - How to build a Video Course Website Overview Setup Book Version Other Books by the Author Video Courses Produced by the Author MVC – How to Build a Membership Website (video course) Store Secret Data in NET Core Web App with Azure Key Vault (video course) Source Code Disclaimer – Who Is This Book for? Rights About the Author Part 1: ASP.NET Core 2.0 MVC Your First Application Your First ASP.NET Core Application The Project Layout and the File System 11 Important Files 12 Compiling the Solution 14 The Startup.cs File 15 Adding a Configuration Service 16 Creating a Service 18 Example 19 Adding the IMessageService Interface 20 Adding the HardcodedMessageService Class 20 Configure and Use the HardcodedMessageService Class 21 Add and Use the ConfigurationMessageService Class 23 Summary 25 Middleware 27 ASP.NET Core 2.0 MVC & Razor Pages for Beginners How Does Middleware Work? 27 IApplicationBuilder 28 Handling Exceptions 30 Serving Up Static Files 33 Setting Up ASP.NET MVC 34 Summary 37 MVC Controllers 39 Routing 40 Convention-Based Routing 41 Implement Routing 41 Adding Another Controller 42 Attribute Routing 43 IActionResult 47 Implementing ContentResult 47 Using a Model Class and ObjectResult 48 Introduction to Views 50 A View with a Data Collection 52 Adding a Data Service 54 Summary 59 Models 61 View Model Example 62 Changing the Folder Structure 62 Adding the View Model 62 Using the View Model 63 Adding a Details View 64 Adding a Create View 69 Refactoring the Application 70 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Adding the HTTP GET Create Action and the Create View 72 Adding the VideoEditViewModel Class 75 Adding the HTTP POST Create Action 76 Data Annotations 81 Preparing the Create View for Validation 82 Adding Validation to the Create View 82 Validating the Model on the Server 83 Adding Data Annotations in the Video Entity and VideoEditViewModel Class 84 Summary 87 Entity Framework 89 Adding the VideoDbContext Class 89 Configuration in the Startup Class 91 Adding the Initial Migration and Creating the Database 93 Adding the SqlVideoData Service Component 95 Implementing the SqlVideoData Service Component Class 95 Summary 99 Razor Views 101 Layout Views 101 Adding the _Layout View 102 Altering the Content Views 102 The _ViewStart file 106 The _ViewImports file 107 Tag Helpers 108 Altering the Index View 109 Adding an Edit View and Its Actions 111 Refactoring the IVideoData Service 113 Partial Views 117 ASP.NET Core 2.0 MVC & Razor Pages for Beginners View Components 120 Adding a View Component for the IMessageService Service 120 Summary 123 Forms Authentication 125 Adding the Authorize and AlowAnonymous Attributes 126 Configuring the Identity Framework 127 Creating the AspNet Identity Database Tables 129 User Registration 130 Login and Logout 137 Adding the _Login Partial View 137 Adding the Logout Action 140 Adding the LoginViewModel Class 141 Adding the HTTP GET Login Action 142 Adding the HTTP POST Login Action 142 Adding the Login View 144 Summary 147 Front-End Frameworks 149 Installing Bower and the Frameworks 149 Styling with Bootstrap 152 Adding a Navigation Bar 153 Styling the Index View 155 Adding Client-Side Validation 157 Summary 159 Part 2: MVC How to Build a Video Course Website 161 The Use Case 163 Introduction 163 The Use Case 163 ASP.NET Core 2.0 MVC & Razor Pages for Beginners The User Interface (MVC) 164 Login and Register User 164 The Administrator Interface (Razor Pages) 165 Conclusion 165 Login and Register 165 The User Dashboard View 166 The Course View 167 The Video View 168 The Administrator Dashboard Razor Page 169 A Typical Administrator Index Razor Page 170 A Typical Administrator Create Razor Page 171 A Typical Administrator Edit Razor Page 172 A Typical Administrator Delete Razor Page 173 10 Setting Up the Solution 175 Introduction 175 Technologies Used in This Chapter 175 Overview 175 Creating the Solution 175 Installing AutoMapper 178 Creating the Database 179 Adding the Database Project 180 Adding the User Class 180 Adding the Database Context 180 Summary 183 11 Login 185 Introduction 185 Technologies Used in This Chapter 185 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Redirecting to the Login View 185 Styling the Login View 187 Adding the login.css Stylesheet 188 Changing the Layout of the Login View 189 Styling the Login View 193 Summary 195 12 Register User 197 Introduction 197 Technologies Used in This Chapter 197 Overview 197 Changing the Layout of the Register View 198 Styling the Register View 200 Changing the Register Action 202 Testing the Registration Form 202 Summary 204 13 Modifying the Navigation Bar 205 Introduction 205 Technologies Used in This Chapter 205 Overview 205 Styling the Navigation Bar 206 Remove the Register and Login Links 208 Add the Drop-Down Menu 208 Style the Drop-Down Menu 210 Summary 211 14 Data Transfer Objects 213 Introduction 213 Technologies Used in This Chapter 213 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Overview 213 The DTOs 213 Adding the DTOs 218 The View Models 221 Adding the View Models 222 Summary 223 15 Entity Classes 225 Introduction 225 Technologies Used in This Chapter 225 Overview 225 The Entities 225 The Video Entity 225 The Download Entity 226 The Instructor Entity 227 The Course Entity 228 The Module Entity 228 The UserCourse Entity 229 Adding the Entity Classes 230 Summary 233 16 Mock Data Repository 235 Introduction 235 Technologies Used in This Chapter 235 Overview 235 Add the IReadRepository Interface and MockReadRepository Class 235 Add Data to the MockReadRepository Class 236 The Course List 236 The UserCourses List 237 ASP.NET Core 2.0 MVC & Razor Pages for Beginners The Modules List 237 The Downloads List 237 The Instructors List 238 The Videos List 238 The GetCourses Method 239 Testing the GetCourses Method 240 The GetCourse Method 241 Testing the GetCourse Method 243 The GetVideo Method 243 Testing the GetVideo Method 244 The GetVideos Method 245 Testing the GetVideos Method 247 Summary 248 17 The Membership Controller and AutoMapper 249 Introduction 249 Technologies Used in This Chapter 249 Overview 249 Adding the Membership Controller 250 Adding the Controller 250 Configuring AutoMapper 253 Implementing the Action Methods 255 The Dashboard Action Method 255 The Course Action Method 259 The Video Action Method 262 Summary 268 18 The Dashboard View 269 Introduction 269 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Technologies Used in This Chapter 269 Overview 269 Implementing the Dashboard View 270 Adding the Dashboard View 270 Iterating Over the Courses in the Dashboard View 272 Creating the _CoursePanelPartial Partial View 274 Styling the Dashboard View and the _CoursePanelPartial Partial View 277 Summary 280 19 The Course View 281 Introduction 281 Technologies Used in This Chapter 281 Overview 281 Adding the Course View 282 Adding the Back to Dashboard Button 284 Adding the Course.css Style Sheet 285 Adding the Course Information to the View 286 Styling the Course Information Section 288 Adding Columns for the Modules and the Instructor Bio 289 Adding the Modules 290 Adding the Videos 291 Styling the _ModuleVideosPartial View 295 Adding the Downloads 297 Styling the _ModuleDownloadsPartial View 300 Adding the Instructor Bio 301 Styling the _InstructorBioPartial Partial View 303 Summary 303 20 The Video View 305 ASP.NET Core 2.0 MVC & Razor Pages for Beginners The DeleteModel Class Open the DeleteModel class in the Courses folder (the cshtml.cs file) Change the namespace to Courses namespace VideoOnDemand.Admin.Pages.Courses Change the data type to Course for the Input variable public Course Input { get; set; } = new Course(); Change the data type to Course for the Get method call in the OnGet method Input = _dbReadService.Get(id, true); Change the text in the SuccessMessage property to Deleted Course: followed by the course title StatusMessage = $"Deleted Course: {Input.Title}."; Save all files The Delete Razor Page Open the Delete Razor Page in the Courses folder (the cshtml file) Change the ViewData title to Delete Course Change the folder part of the path attribute of all the elements from Videos to Courses Change the contents of the and elements to match the properties in the Input object Save all files The Modules Razor Pages Copy the Videos folder and all its contents Paste in the copied folder in the Pages folder and rename it Modules The IndexModel Class Open the IndexModel class in the Modules folder (the cshtml.cs file) Change the namespace to Modules namespace VideoOnDemand.Admin.Pages.Modules Change the IEnumerable collection to store Module objects and rename it Items public IEnumerable Items = new List(); 496 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Replace the data type defining the GetWithIncludes method to Module public void OnGet() { Items = _dbReadService.GetWithIncludes(); } Save all files The Index Razor Page Open the Index Razor Page in the Modules folder (the cshtml file) Change the ViewData title to Module Change the folder part of the path attribute of all the elements from Videos to Modules Change the headings in the elements to match the property values of the table Add and remove elements as needed Change the elements to display the values from the properties in the item loop variable Add and remove elements as needed Save all files The CreateModel Class Open the CreateModel class in the Modules folder (the cshtml.cs file) Change the namespace to Modules namespace VideoOnDemand.Admin.Pages.Modules Replace the IEnumerable Input property with one for the Module entity public Module Input { get; set; } = new Module(); Rename the dynamic Modules property Courses and change the defining type of the method to Course public void OnGet() { ViewData["Courses"] = _dbReadService.GetSelectList( "Id", "Title"); } Remove the Input.CourseId property code from the OnPostAsync method Change the text in the SuccessMessage property to Created a new Module: followed by the course title StatusMessage = $"Created a new Module: {Input.Title}."; 497 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Save all files The Create Razor Page Open the Create Razor Page in the Modules folder (the cshtml file) Change the ViewData title to Create Module Change the Video folder in the path attribute to Modules in the first element Change the content in the form-group elements to display the values from the properties in the Input variable Add and remove form-group elements as needed Save all files The EditModel Class Open the EditModel class in the Modules folder (the cshtml.cs file) Change the namespace to Modules namespace VideoOnDemand.Admin.Pages.Modules Change the data type to Module for the Input variable public Module Input { get; set; } = new Module(); Rename the dynamic Modules property Courses and change the defining type of the method to Course in the OnGet method ViewData["Courses"] = _dbReadService.GetSelectList( "Id", "Title"); Change the data type to Module and remove the true parameter for the Get method call in the OnGet method You remove the true parameter because related entities don’t need to be loaded Input = _dbReadService.Get(id); Remove the Input.CourseId and Input.Course code rows from the OnPostAsync method Replace the text in the SuccessMessage property to Updated Module: followed by the course title StatusMessage = $"Updated Module: {Input.Title}."; Save all files 498 ASP.NET Core 2.0 MVC & Razor Pages for Beginners The Edit Razor Page Open the Edit Razor Page in the Modules folder (the cshtml file) Change the ViewData title to Edit Module Change the folder part of the path attribute of all the elements from Videos to Modules Change the form-group elements’ contents to match the properties in the Input object Save all files The DeleteModel Class Open the DeleteModel class in the Modules folder (the cshtml.cs file) Change the namespace to Modules namespace VideoOnDemand.Admin.Pages.Modules Change the data type to Module for the Input variable public Module Input { get; set; } = new Module(); Change the data type to Module for the Get method call in the OnGet method Input = _dbReadService.Get(id, true); Change the text in the SuccessMessage property to Deleted Module: followed by the module title StatusMessage = $"Deleted Module: {Input.Title}."; Save all files The Delete Razor Page Open the Delete Razor Page in the Modules folder (the cshtml file) Change the ViewData title to Delete Module Change the folder part of the path attribute of all the elements from Videos to Modules Change the contents of the and elements to match the properties in the Input object Save all files The UserCourses Razor Pages Copy the Videos folder and all its contents Paste in the copied folder in the Pages folder and rename it UserCourses 499 ASP.NET Core 2.0 MVC & Razor Pages for Beginners The IndexModel Class Open the IndexModel class in the UserCourses folder (the cshtml.cs file) Change the namespace to UserCourse namespace VideoOnDemand.Admin.Pages.UserCourses Change the IEnumerable collection to store UserCourse objects and rename it Items public IEnumerable Items = new List(); Replace the data type defining the GetWithIncludes method to UserCourse public void OnGet() { Items = _dbReadService.GetWithIncludes(); } Save all files The Index Razor Page Open the Index Razor Page in the UserCourses folder (the cshtml file) Change the ViewData title to Users and Courses Change the folder part of the path attribute of all the elements from Videos to UserCourses Change the headings in the elements to match the property values of the entity Add and remove elements as needed Change the elements to display the values from the properties in the item loop variable Add and remove elements as needed Remove the id attribute of the element Add two id attributes called id-UserId and id-CourseId to the elements and assign the appropriate properties to them from the item loop variable Save all files 500 ASP.NET Core 2.0 MVC & Razor Pages for Beginners The CreateModel Class Open the CreateModel class in the UserCourses folder (the cshtml.cs file) Change the namespace to UserCourse namespace VideoOnDemand.Admin.Pages.UserCourses Replace the Input property with one for the UserCourse entity public UserCourse Input { get; set; } = new UserCourse(); Inject the IUserService service into the constructor and save the object in a private class-level variable called _userService private IUserService _userService; public CreateModel(IDbReadService dbReadService, IDbWriteService dbWriteService, IUserService userService) { _dbReadService = dbReadService; _dbWriteService = dbWriteService; _userService = userService; } Rename the dynamic Modules property in the OnGet method Courses and change the defining type of the method to Course ViewData["Courses"] = _dbReadService.GetSelectList( "Id", "Title"); Add another dynamic property called Users with the defining type User Specify that the user’s email address should be displayed in the drop-down ViewData["Users"] = _dbReadService.GetSelectList( "Id", "Email"); Remove the Input.CourseId property code from the OnPostAsync method Fetch the course and user from the database in the success if-block and use the course title and user email in the SuccessMessage property if (success) { var user = _userService.GetUser(Input.UserId); var course = _dbReadService.Get(Input.CourseId); StatusMessage = $"User-Course combination [{course.Title} | {user.Email}] was created."; return RedirectToPage("Index"); } 501 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Copy the two ViewData properties from the OnGet method and paste them in above the return statement at the end of the OnPostAsync method to fill the drop-downs again ViewData["Users"] = _dbReadService.GetSelectList( "Id", "Email"); ViewData["Courses"] = _dbReadService.GetSelectList( "Id", "Title"); return Page(); 10 Save all files The Create Razor Page Open the Create Razor Page in the UserCourses folder (the cshtml file) Change the ViewData title to Add User to Course Change the Video folder in the path attribute to UserCourses in the first element Delete all form-group elements and add two elements for the Users and Courses collections in the dynamic ViewBag object that was filled with the ViewData object in the code-behind file Save all files The UserCoursePageModel Class This class will be used to transfer data to and from the Edit Razor Page in the UserCourses folder The model is necessary since the entity class doesn’t have all the necessary properties needed in the page Add a class called UserCoursePageModel to the Models folder Add two string properties called Email and CourseTitle 502 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Add two properties declared with the UserCourse class called UserCourse and UpdatedUserCourse These two properties will be used to keep track of the original UserCourse values and the values selected by the user in the UI Save the file The complete code for the UserCoursePageModel class: public class UserCoursePageModel { public string Email { get; set; } public string CourseTitle { get; set; } public UserCourse UserCourse { get; set; } = new UserCourse(); public UserCourse UpdatedUserCourse { get; set; } = new UserCourse(); } The EditModel Class Open the EditModel class in the UserCourses folder (the cshtml.cs file) Change the namespace to UserCourses namespace VideoOnDemand.Admin.Pages.UserCourses Replace the Input property data type with the UserCoursePageModel class public UserCoursePageModel Input { get; set; } = new UserCoursePageModel(); Inject the IUserService service into the constructor and save the object in a private class-level variable called _userService Rename the dynamic Modules property in the OnGet method Courses and change the defining method type to Course ViewData["Courses"] = _dbReadService.GetSelectList( "Id", "Title"); Change the name of the id parameter sent in to the OnGet method to courseId and add a second parameter called userId (string) Remove the line of code that assigns a value to the Input object in the OnGet method Fetch the user-course combination from the UserCourses database table matching the user id and course id sent in to the OnGet method and store it in the UserCourse property of the Input object Input.UserCourse = _dbReadService.Get( 503 ASP.NET Core 2.0 MVC & Razor Pages for Beginners userId, courseId); Assign the value of the UserCourse property of the Input object to the UpdatedUserCourse property The two values will initially be the same, but when the user selects values in the UI the values of the UpdatedUserCourse property will change Input.UpdatedUserCourse = Input.UserCourse; 10 Fetch the course and user from the database and assign the course title and user email to the CourseTitle and Email properties of the Input object public void OnGet(int courseId, string userId) { ViewData["Courses"] = _dbReadService.GetSelectList("Id", "Title"); Input.UserCourse = _dbReadService.Get( userId, courseId); Input.UpdatedUserCourse = Input.UserCourse; var course = _dbReadService.Get(courseId); var user = _userService.GetUser(userId); Input.CourseTitle = course.Title; Input.Email = user.Email; } 11 Remove the Input.CourseId and Input.Course assignments from the OnPostAsync method 12 Pass in the UserCourse and UpdatedUserCourse properties from the Input object to the Update method in the OnPostAsync method 13 Fetch the updated user-course combination from the database in the success ifblock and use the values in the SuccessMessage property text if (success) { var updatedCourse = _dbReadService.Get( Input.UpdatedUserCourse.CourseId); StatusMessage = $"The [{Input.CourseTitle} | {Input.Email}] combination was changed to [{updatedCourse.Title} | {Input.Email}]."; return RedirectToPage("Index"); } 504 ASP.NET Core 2.0 MVC & Razor Pages for Beginners 14 Copy the ViewData property from the OnGet method and paste it in above the return statement at the end of the OnPostAsync method to fill the drop-down again ViewData["Courses"] = _dbReadService.GetSelectList( "Id", "Title"); return Page(); 15 Save all files The complete code for the EditModel class: [Authorize(Roles = "Admin")] public class EditModel : PageModel { private IDbWriteService _dbWriteService; private IDbReadService _dbReadService; private IUserService _userService; [BindProperty] public UserCoursePageModel Input { get; set; } = new UserCoursePageModel(); [TempData] public string StatusMessage { get; set; } public EditModel(IDbReadService dbReadService, IDbWriteService dbWriteService, IUserService userService) { _dbWriteService = dbWriteService; _dbReadService = dbReadService; _userService = userService; } public void OnGet(int courseId, string userId) { ViewData["Courses"] = _dbReadService.GetSelectList( "Id", "Title"); Input.UserCourse = _dbReadService.Get( userId, courseId); Input.UpdatedUserCourse = Input.UserCourse; var course = _dbReadService.Get(courseId); var user = _userService.GetUser(userId); Input.CourseTitle = course.Title; Input.Email = user.Email; } 505 ASP.NET Core 2.0 MVC & Razor Pages for Beginners public async Task OnPostAsync() { if (ModelState.IsValid) { var success = await _dbWriteService.Update(Input.UserCourse, Input.UpdatedUserCourse); if (success) { var updatedCourse = _dbReadService.Get( Input.UpdatedUserCourse.CourseId); StatusMessage = $"The [{Input.CourseTitle} | {Input.Email}] combination was changed to [{updatedCourse.Title} | {Input.Email}]."; return RedirectToPage("Index"); } } // If we got this far, something failed, redisplay form ViewData["Courses"] = _dbReadService.GetSelectList( "Id", "Title"); return Page(); } } The Edit Razor Page Open the Edit Razor Page in the UserCourses folder (the cshtml file) Change the ViewData title to Change course for user Change the folder part of the path attribute of all the elements from Videos to UserCourses Replace the hidden element with four hidden elements for the following properties: Input.UserCourse.UserId, Input.UserCourse.CourseId, Input.UpdatedUserCourse.UserId, Input.CourseTitle Delete all form-group elements and add a element for the Courses collection in the dynamic ViewBag object (that was filled with the ViewData object in the code-behind file) Also, add a readonly element 506 ASP.NET Core 2.0 MVC & Razor Pages for Beginners for the user’s email address; it should be read-only because the administrator should not be able change user Save all files The DeleteModel Class Open the DeleteModel class in the UserCourses folder (the cshtml.cs file) Change the namespace to UserCourses namespace VideoOnDemand.Admin.Pages.UserCourses Change the data type to UserCoursePageModel for the Input variable public UserCoursePageModel Input { get; set; } = new UserCoursePageModel(); Inject the IUserService service into the constructor and save the object in a private class-level variable called _userService Rename the id parameter courseId and add a second parameter called userId (string) to the OnGet method Delete the code in the OnGet method Fetch the course, user, and user-course from the database Assign the course title and user email to the CourseTitle and Email properties and the user-course to the UserCourse property of the Input object public void OnGet(int courseId, string userId) { var user = _userService.GetUser(userId); var course = _dbReadService.Get(courseId); Input.UserCourse = _dbReadService.Get( userId, courseId); Input.Email = user.Email; Input.CourseTitle = course.Title; } 507 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Change the parameter sent into the Delete method to Input.UserCourse in the OnPostAsync method var success = await _dbWriteService.Delete(Input.UserCourse); Change the text in the SuccessMessage property StatusMessage = $"User-Course combination [{Input.CourseTitle} | {Input.Email}] was deleted."; 10 Save all files The Delete Razor Page Open the Delete Razor Page in the UserCourses folder (the cshtml file) Change the ViewData title to Remove user from course Change the folder part of the path attribute of all the elements from Videos to UserCourses Replace the id attribute of the Edit button with two new ids for user id and course id Change the contents of the and elements to match the properties in the Input object Replace the hidden elements with four hidden elements for the following properties: Input.UserCourse.UserId, Input.UserCourse.CourseId, Input.Email, Input.CourseTitle Save all files Summary In this chapter, you implemented the rest of the Razor Pages needed in the administration application by reusing already created Razor Pages Thank you for taking the time to read the book and implement the projects 508 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Other Books by the Author ASP.NET Core 2.0 – MVC & Razor Pages ASP.NET Core 1.1 – Building a Website ASP.NET Core 1.1 – Building a Web API ASP.NET MVC – Building a Website C# for Beginners 509 ASP.NET Core 2.0 MVC & Razor Pages for Beginners Video Courses by the Author MVC – How to Build a Membership Website (video course) This is a comprehensive video course on how to build a membership site using ASP.NET MVC The course has in excess of 24 hours of video In this video course you will learn how to build a membership website from scratch You will create the database using Entity Framework code-first, scaffold an Administrator UI, and build a front-end UI using HTML5, CSS3, Bootstrap, JavaScript, C#, and MVC Prerequisites for this course are: a good knowledge of the C# language and basic knowledge of MVC 5, HTML5, CSS3, Bootstrap, and JavaScript You can watch this video course on Udemy at this URL: www.udemy.com/building-a-mvc-5-membership-website Store Secret Data in a NET Core Web App with Azure Key Vault (video course) In this Udemy course you will learn how to store sensitive data in a secure manner First you will learn how to store data securely in a file called secrets.json with the User Manager The file is stored locally on your machine, outside the project’s folder structure, and is therefore not checked into your code repository Then you will learn how to use Azure Web App Settings to store key-value pairs for a specific web application The third and final way to secure your sensitive data is using Azure Key Vault, secured with Azure Active Directory in the cloud The course is taught using an ASP.NET Core 2.0 Web API solution in Visual Studio 2015 You really need to know this if you are a serious developer You can watch this video course on Udemy at this URL: www.udemy.com/store-secret-data-in-net-core-web-app-with-azure-key-vault 510 ... & Razor Pages ASP. NET Core 1.1 – Building a Website ASP. NET Core 1.1 – Building a Web API ASP. NET MVC – Building a Website C# for Beginners ASP. NET Core 2. 0 MVC & Razor Pages for Beginners Video. .. video courses have been specifically written with the student in mind ASP. NET Core 2. 0 MVC & Razor Pages for Beginners Part 1: ASP. NET Core 2. 0 MVC Your First Application ASP. NET Core 2. 0 MVC & Razor. .. Typical Administrator Index Razor Page 1 70 A Typical Administrator Create Razor Page 171 A Typical Administrator Edit Razor Page 1 72 A Typical Administrator Delete Razor

Ngày đăng: 15/09/2020, 11:40

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan