Skip to content
Home » Asp Net Core Mvc | Làm Sao Để Sử Dụng Action Result?

Asp Net Core Mvc | Làm Sao Để Sử Dụng Action Result?

FULL MATCH: MÃ Minh Cẩm - Frederic CAUDRON | Bán Kết PBA - Silkroad & Ansan PBA Championship 23-24

Dependency injection

ASP.NET Core has built-in support for dependency injection (DI). In ASP.NET Core MVC, controllers can request needed services through their constructors, allowing them to follow the Explicit Dependencies Principle.

Your app can also use dependency injection in view files, using the

@inject

directive:


@inject SomeService ServiceName

<br /> @ServiceName.GetTitle<br />

@ServiceName.GetTitle



Tham khảo[sửa | sửa mã nguồn]

Part 5, work with a database in an ASP.NET Core MVC app

Note

This isn’t the latest version of this article. For the current release, see the ASP.NET Core 8.0 version of this article.

By Rick Anderson and Jon P Smith.

The

MvcMovieContext

object handles the task of connecting to the database and mapping

Movie

objects to database records. The database context is registered with the Dependency Injection container in the

Program.cs

file:


var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext

(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

The ASP.NET Core Configuration system reads the

ConnectionString

key. For local development, it gets the connection string from the

appsettings.json

file:


"ConnectionStrings": { "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db" }

When the app is deployed to a test or production server, an environment variable can be used to set the connection string to a production SQL Server. For more information, see Configuration.

FULL MATCH: MÃ Minh Cẩm - Frederic CAUDRON | Bán Kết PBA - Silkroad & Ansan PBA Championship 23-24
FULL MATCH: MÃ Minh Cẩm – Frederic CAUDRON | Bán Kết PBA – Silkroad & Ansan PBA Championship 23-24

Model binding

ASP.NET Core MVC model binding converts client request data (form values, route data, query string parameters, HTTP headers) into objects that the controller can handle. As a result, your controller logic doesn’t have to do the work of figuring out the incoming request data; it simply has the data as parameters to its action methods.


public async Task

Login(LoginViewModel model, string returnUrl = null) { ... }

SQL Server Express LocalDB

LocalDB:

  • Is a lightweight version of the SQL Server Express Database Engine, installed by default with Visual Studio.
  • Starts on demand by using a connection string.
  • Is targeted for program development. It runs in user mode, so there’s no complex configuration.
  • By default creates .mdf files in the C:/Users/{user} directory.

Examine the database

From the View menu, open SQL Server Object Explorer (SSOX).

Right-click on the

Movie

table (

dbo.Movie

) > View Designer

Note the key icon next to

ID

. By default, EF makes a property named

ID

the primary key.

Right-click on the

Movie

table > View Data

Full Course - Learn ASP.NET Core MVC in .NET 8 | CRUD Operations | EntityFramework | MVC Tutorial
Full Course – Learn ASP.NET Core MVC in .NET 8 | CRUD Operations | EntityFramework | MVC Tutorial

Filters

Filters help developers encapsulate cross-cutting concerns, like exception handling or authorization. Filters enable running custom pre- and post-processing logic for action methods, and can be configured to run at certain points within the execution pipeline for a given request. Filters can be applied to controllers or actions as attributes (or can be run globally). Several filters (such as

Authorize

) are included in the framework.

[Authorize]

is the attribute that is used to create MVC authorization filters.


[Authorize] public class AccountController : Controller

Content Result

JsonResult

Action result này trả về dữ liệu được định dạng JSON. Nó chuyển một object sang JSON và trả nó về client:


public JsonResult About() { return Json(object); } or public JsonResult About() { return new JsonResult(object); }

ContentResult

ContentResult ghi một nội dung cụ thể trực tiếp vào response như một chuỗi định dạng văn bản thuần.


public ContentResult About() { return Content("Hello World"); } hoặc public ContentResult About() { return new ContentResult() { Content = "Hello World" }; }

EmptyResult

EmptyResult giống như tên của nó không chứa cái gì cả. Sử dụng nó khi bạn muốn thực thi một số logic trong controller nhưng không muốn trả về gì.


return new EmptyResult();

FULL MATCH: Frederic CAUDRON - GO Do-young | PBA R32 - Silkroad & Ansan PBA Championship 23-24
FULL MATCH: Frederic CAUDRON – GO Do-young | PBA R32 – Silkroad & Ansan PBA Championship 23-24

Tại sao lại dùng Action Result?

Không cần phải sử dụng Action Result trong ASP.NET Core. Các Controller không cần phải kế thừa từ Controller class. Bạn có thể thao tác trự tiếp với đối tượng HTTP Response trong Controller và quyết định xem trả về gì?

Ví dụ dưới đây mô tả cách inject đối tượng HttpContext vào Constructor của Controller và sau đó sử dụng nó để tạo ra Response:


public class HomeController { HttpContext ctx; public HomeController(IHttpContextAccessor _ctx) { ctx = _ctx.HttpContext; } public async void Index() { //Set Status Code ctx.Response.StatusCode = 200; //Set Content Type ctx.Response.ContentType = "text/html"; //Create Response ctx.Response.Headers.Add("SomeHeader", "Value"); byte[] content = Encoding.ASCII.GetBytes($"


Hello World


"); //Send it to the Client await ctx.Response.Body.WriteAsync(content, 0, content.Length); } }

Mặc dù cách tiếp cận này vẫn làm việc bình thường nhưng nó không phải là cách tốt nhất để tạo ra Response từ Controller. Xử lý tất cả các controller như thế này sẽ nhàm chán, dễ sinh lỗi và khó bảo trì. Action Result đóng gói tất cả các chi tiết vào trong nó. Nó có nhiều các tính năng hữu dụng giúp dễ dàng hơn trong việc tạo response.

Tạo ra Response trực tiếp từ Controller class như ví dụ trên. Nó sẽ làm khó cho Unit Test. Unit Test một Controller class sẽ cần phải mock các triển khai của Response object. Để test kế quả chúng ta lại cần chuyển nó sang HTML Response.

Action Result sẽ có tất cả những gì cần thiết để chạy Controller và Action method. Đối tượng context sẽ dễ dàng được giả lập thông qua base class của nó. Bạn không cần phải chuyển bất cứ kết quả sang HTML để kiểm trả kết quả của một action method. Bạn có thể kiểm tra ngay đối tượng ActionResult để đảm bảo rằng bạn nhận kết quả như mng muốn.

SQL Server Express LocalDB

LocalDB:

  • Is a lightweight version of the SQL Server Express Database Engine, installed by default with Visual Studio.
  • Starts on demand by using a connection string.
  • Is targeted for program development. It runs in user mode, so there’s no complex configuration.
  • By default creates .mdf files in the C:/Users/{user} directory.

Examine the database

From the View menu, open SQL Server Object Explorer (SSOX).

Right-click on the

Movie

table (

dbo.Movie

) > View Designer

Note the key icon next to

ID

. By default, EF makes a property named

ID

the primary key.

Right-click on the

Movie

table > View Data

Trà My Đầu Xuân Giaps Thìn 2024 - Nhà Vườn Phạm Tuyến
Trà My Đầu Xuân Giaps Thìn 2024 – Nhà Vườn Phạm Tuyến

Strongly typed views

Razor views in MVC can be strongly typed based on your model. Controllers can pass a strongly typed model to views enabling your views to have type checking and IntelliSense support.

For example, the following view renders a model of type

IEnumerable

:


@model IEnumerable

    @foreach (Product p in Model) {

  • @p.Name
  • }

Làm sao để sử dụng Action Result?

Như đã nhắc đến ở trên, ActionResult là một abstract class base mà triển khai IActionResult. Nó được định nghĩa trong namespace: Microsoft.AspNetCore.Mvc. ContentResult là một trong số các Action Result trả về một chuỗi văn bản:


public class HomeController : Controller { public ContentResult Index() { ContentResult v = new ContentResult(); v.Content = "Hello World"; return v; } }

Phương thức Index trả về một ContentResult. Đầu tiên chúng ta khởi tạo đối tượng của ContentResult sau đó gán giá trị “Hello World” cho thuộc tính Content của nó và trả về.

Chúng ta có một Helper method của Controller base class đó là View nó cũng làm việc tương tự nhưng code ngắn hơn nhiều:


public ContentResult Index() { return Content("Hello"); }

Phương thức Content cũng gọi ContentResult ngầm định. Hầu hết các Action Result đều có helper method được định nghĩa trong Controller base class. Thường thì các phương thức này có từ “Result”. Ví dụ: Content cho ContentResult, View cho ViewResult.

Build an Expense Tracker with Asp.Net Core MVC
Build an Expense Tracker with Asp.Net Core MVC

Đặc tính[sửa | sửa mã nguồn]

Trang aspx[sửa | sửa mã nguồn]

Những trang ASP.NET, được biết đến như những web form, là khối chính trong phát triển ứng dụng. Những web form được chứa trong những file có phần mở rộng ASPX; những nhà phát triển có thể đặt nội dung tĩnh hoặc động vào trang aspx dưới dạng server-side Web Control và User Control. Ngoài ra, có thể viết mã bằng cách chèn

<% -- mã cần viết -- %>

vào trang web giống như những công nghệ phát triển web khác PHP, JSP và ASP, nhưng những công nghệ nào không hỗ trợ data binding khi nó phát sinh nội dung trang web.

Ví dụ sau sử dụng mã “inline”, một dạng ngược lại với code behind.

<%@ Page Language=”C#” %>


<br /> Sample page<br />

The current time is:


Mô hình Code-behind[sửa | sửa mã nguồn]

Mô hình code-behind được giới thiệu bởi Microsoft, đưa ra cách viết mã linh động bằng cách để những mã lập trình trong một tập tin riêng eCodeBehind:

System.Web.UI.Page { protected override void Page_Load(EventArgs e) { base.OnLoad(e); } } }

Trong trường hợp này, phương thức Page_Load() được thực thi mỗi lần trang ASPX được request. Người lập trình có thể viết mã xử lý trong phương thức này.

Kết luận

Trong bài học này chúng ta bước đầu làm quen với dự án ASP.NET Core MVC, bao gồm cấu hình sử dụng MVC từ dự án rỗng và sử dụng template sẵn có cho dự án MVC.

+ Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.+ Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.+ Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.Cảm ơn bạn!

10 lý do các doanh nghiệp nên chọn ASP.NET Core để phát triển ứng dụng Web

Đăng lúc: 03:50 PM – 10/11/2022 bởi Charles Chung – 902

Trong bài viết này tôi sẽ trình bày sự khác biệt giữa ASP.NET Core và ASP.NET MVC 5 và đưa ra các lý do tại sao các doanh nghiệp nên chọn ASP.NET Core để phát triển các ứng dụng Web.

ASP.NET MVC là gì?

Được Microsoft tung ra vào năm 2009, ASP.NET MVC là Framework phát triển ứng dụng web cung cấp kiến trúc MVC mã nguồn mở. ASP.NET MVC là một giải pháp thay thế cho ASP.NET WebForms, được sử dụng để xây dựng và chạy các ứng dụng web. ASP.NET MVC Framework đã trở nên khá nổi tiếng trong vài năm qua và là một trong những lựa chọn phù hợp cho các lập trình viên xây dựng các loại ứng dụng và dịch vụ web khác nhau. Nó nổi tiếng trong số các nhà phát triển vì các ứng dụng web ASP.NET MVC dễ phát triển và gỡ lỗi hơn. Điều này có thể dễ dàng thực hiện với một chương trình phát triển tích hợp có tên Visual Studio.NET. Một số công ty lớn nhất như Microsoft, Stack, Overflow, Ikea và Volvo có các trang web được quản lý mạnh bởi ASP.NET MVC. Tuy nhiên, một câu hỏi phổ biến được đặt ra là liệu ASP.NET MVC có lỗi thời so với ASP.NET Core hay không?

Rất tiếc, ASP.NET MVC không còn được phát triển mạnh, vì vậy ASP.NET MVC Framework sẽ không nhận được thêm các bản cập nhật và cải tiến. Bản cập nhật cuối cùng của ASP.NET MVC (phiên bản 5.2.7) đã được phát hành 4 năm trước, vào tháng 11 năm 2018.

Sự khác nhau chính giữa ASP.NET CoreASP.NET MVC 5.

ASP.NET Core là một phiên bản thương mại điện tử mã nguồn mở của ASP.NET. Đây là Web Framework đa nền tảng miễn phí được Microsoft phát hành vào tháng 6 năm 2016. Khuôn khổ này có thể được sử dụng để phát triển các ứng dụng trang web hoặc máy tính để bàn có thể được triển khai trong bất kỳ hệ điều hành nào. ASP.NET Core là một môi trường đám mây để phát triển và triển khai.

Sự khác biệt chính giữa ASP.NET MVC và ASP.NET Core là cách tiếp cận đa nền tảng của chúng. ASP.NET Core có thể được sử dụng trên Windows, Mac hoặc Linux, trong khi ASP.NET MVC chỉ có thể được sử dụng cho các ứng dụng trên Windows. Trên hết, xét về mức độ phổ biến và ưa thích, ASP.NET Core chủ yếu là người chiến thắng trong cả hai trường hợp này.

ASP.NET Core MVC là một Framework để xây dựng các ứng dụng web và API, và các dịch vụ phát triển ứng dụng dành cho thiết bị di động, được tối ưu hóa để sử dụng với ASP.NET Core. Framework là mã nguồn mở và có khả năng kiểm tra cao vì nó sử dụng các tiêu chuẩn web mới nhất cùng với việc hỗ trợ phát triển thân thiện với TDD. Nó cũng hoạt động với cơ sở dữ liệu và có thể thêm tìm kiếm và xác nhận. Hơn nữa, Framework kết hợp định tuyến, ràng buộc và mô hình xác thực, API web, components, razor view engine, và nhiều tính năng khác.

10 lý do các doanh nghiệp nên chọn ASP.NET Core để phát triển web?

1. Hiệu suất nâng cao

ASP.NET Core nhanh hơn nhiều so với ASP.NET MVC và đã cho thấy kết quả tuyệt vời so với các Framework khác. Một lý do giải thích cho hiệu suất nhanh của Framework là thực tế là hệ thống tự động tối ưu hóa các mã của nó để cải thiện hiệu suất.

2. Hỗ trợ đa nền tảng

ASP.NET Core là đa nền tảng và chạy trên Windows, Linux, Mac và tất cả các thiết bị khác. Do đó, hệ thống cho phép các nhà phát triển chọn bất kỳ hệ điều hành nào để thuận tiện cho họ vì nó cực kỳ linh hoạt.

3. Ít mã hơn

ASP.NET Core cho phép các nhà phát triển viết ít câu lệnh hơn. Do đó, cấu trúc mã trở nên dễ dàng hơn và ít phải viết mã hơn. Điều này làm cho việc phát triển ứng dụng dành cho thiết bị di động trở nên hiệu quả về mặt chi phí đối với các tổ chức. Ngoài ra, nó cũng cung cấp nhiều quyền kiểm soát hơn cho các nhà phát triển khi quy trình có liên quan và đơn giản hóa việc gỡ lỗi.

4. Bảo trì dễ dàng

Như đã đề cập trước đó, ASP.NET yêu cầu ít mã hơn và ít mã hơn sẽ dễ bảo trì hơn. Các nhà phát triển có thể dễ dàng tối ưu hóa mã trong ASP.NET Core và tiết kiệm thời gian bảo trì ứng dụng.

5. Hỗ trợ phát triển ứng dụng web dựa trên đám mây

Một lợi ích khác của ASP.NET Core là nó cung cấp các loại phát triển ứng dụng khác nhau và ứng dụng web dựa trên đám mây. Vì vậy, cách tiếp cận này là phù hợp nhất cho các doanh nghiệp và doanh nghiệp đã sẵn sàng để mở rộng. Phát triển dựa trên đám mây cung cấp cho các ứng dụng web tính linh hoạt, khả năng truy cập, tích hợp dễ dàng hơn, bảo vệ dữ liệu và hơn thế nữa.

6. Nguồn mở

ASP.NET Core là mã nguồn mở, có nghĩa là bất kỳ chuyên gia ASP.NET Core nào cũng có quyền truy cập vào Framework. Tất cả các nhà phát triển .NET Core đều có thể cải tiến công nghệ và sửa đổi nó theo nhu cầu phát triển ứng dụng của họ. Điều này giúp các nhà phát triển tạo ra các giải pháp web tốt nhất với ASP.NET Core.

7. Lưu trữ

.NET Core cung cấp một máy chủ nội bộ cho mọi ứng dụng web ASP.NET Core theo mặc định. Nó cho phép chạy các ứng dụng ASP.NET Core trên Windows, Mac hoặc Linux. Hơn nữa, nó có trọng lượng nhẹ và hỗ trợ Lớp cổng bảo mật (SSL).

8. Bảo mật tốt hơn

ASP.NET Core có một số tính năng tích hợp cho phép các nhà phát triển tạo các ứng dụng web an toàn hơn. Công nghệ này giúp duy trì việc thực thi, xác thực, ủy quyền và bảo vệ dữ liệu HTTPS dễ dàng hơn.

9. Phát triển nhanh chóng

Phát triển nhanh có thể chứng minh là rất có lợi cho các dự án cần được quay vòng trong một thời gian ngắn, chẳng hạn như trong vòng hai đến ba tháng. Trong mô hình phát triển này, tập trung nhiều hơn vào các nhiệm vụ phát triển và tạo mẫu thay vì lập kế hoạch. Nhìn chung, ASP.NET Core linh hoạt và thích ứng với các thay đổi đồng thời giảm rủi ro tổng thể của dự án, mã hóa thủ công và lỗi đồng thời.

10. Khả năng di động tốt hơn

ASP.NET Core có tính di động cao và tính di động có thể làm giảm đáng kể chi phí phát triển web. Framework cho phép bạn di chuyển ứng dụng dễ dàng giữa các máy chủ. Ngoài ra, nhiều nhà phát triển có thể làm việc trên ứng dụng cùng một lúc.

Dịch và chỉnh sửa lại từ: https://www.zenesys.com/blog/asp-net-core-vs-asp-net-mvc-5

thay lời cảm ơn!

Các bài cũ hơn
  • Tìm hiểu Builder Design Pattern với ví dụ sử dụng ngôn ngữ C# (11:44 AM – 09/11/2022)
  • Truy xuất dữ liệu trong ASP.NET Core 2.1 sử dụng Entity Framework Core(Code First) (05:12 PM – 08/11/2022)
  • Tìm hiểu Abstract Factory Design Pattern với ví dụ sử dụng ngôn ngữ C# (08:50 AM – 08/11/2022)
  • Authorization và Authentication sử dụng Cookie trong ASP.NET Core (10:50 AM – 07/11/2022)
  • Tìm hiểu Factory Design Pattern với ví dụ sử dụng ngôn ngữ C# (01:47 PM – 04/11/2022)

Bài viết này chúng ta sẽ tìm hiểu làm sao để định dạng một response trả về trong Action method. ASP.NET Core cung cấp một tập các API gọi là Action Result để tạo ra các định dạng response cho từng nhu cầu. Hãy cùng tìm hiểu về Action Result là gì vầ sự khác nhau giữa các loại Action Result có sẵn nhé.

Cổ phiếu phải có trong nhịp chỉnh
Cổ phiếu phải có trong nhịp chỉnh

HTTP Request và HTTP Response

Khi người dùng thực hiện một yêu cầu bằng cách nhập một đường dẫn hay URL vào thanh địa chỉ của một trình duyệt web thì yêu cầu này sẽ được gửi đến server (cũng có thể được hiểu là web server) thông qua chức năng HTTP request của giao thức HTTP. Tại server, yêu cầu sẽ được xử lý và server sẽ phát sinh một nội dung HTML để gửi trở lại trình duyệt web thông qua chức năng HTTP response của giao thức HTTP.

Quá trình thực thi được phản ánh thông qua 4 bước như hình dưới đây:

Thực hành 2 – Xây dựng View cho ASP.NET Core MVC

Trong phần thực hành 1 bạn đã xây dựng lớp Controller nhưng chưa thấy View và model đâu cả. Trong phần thực hành này chúng ta tiếp tục bổ sung View và sử dụng Model.

Bước 1. Xây dựng action List trong DefaultController như sau:

public IActionResult List() { var model = new List<(string, string)> { (“Donald”, “Trump”), (“Barack”, “Obama”), (“George W.”, “Bush”) }; var view = View(“/DefaultList.cshtml”); view.ViewData.Model = model; return view; }

Bước 2. Tạo file DefaultList.cshtml trực thuộc dự án.

Bạn có thể chọn tên bất kỳ cho file này. Ở đây chúng ta đặt tên DefaultList để dễ hình dung rằng đây là một view tương ứng với action List của DefaultController.

Bước 3. Viết code cho DefaultList.cshtml như sau:

@model List<(string firstName, string lastName)>

<br /> Tự học ICT<br />

    @foreach (var i in Model) {

  • @i.firstName

    @i.lastName
  • }


Nếu bạn đã học qua Razor Pages thì hẳn sẽ rất quen thuộc với đoạn code Razor trên. Thực tế, view trong ASP.NET Core MVC chỉ là một file Razor thông thường. Directive @model có tác dụng báo cho Intellisense biết kiểu của model để hỗ trợ nhắc code.

Lưu ý: so với trang nội dung trong Razor Pages, view trong MVC không có directive @page (liên quan đến mẫu routing tới trang). Do vậy bạn chỉ có thể sử dụng view kết hợp với controller action chứ không thể trực tiếp truy xuất view từ trình duyệt.

Chạy thử với url /default/list, bạn thu được kết quả như sau:

Qua phần thực hành này bạn để ý mấy vấn đề sau:

(1) Model thực tế là bất kỳ dữ liệu nào cần hiển thị. Như trong ví dụ trên, model là một danh sách các cặp giá trị (string, string).

(2) View là một file Razor với directive @model có tác dụng chỉ định kiểu cụ thể của model mà view đang cần hiển thị.

(3) File view được chỉ định qua lời gọi phương thức

var view = View("/DefaultList.cshtml");

Lối viết này báo rằng cần tìm file DefaultList.cshtml trong thư mục dự án.

(4) Giá trị của model được action truyền sang cho view thông qua object của ViewData:

view.ViewData.Model = model;

Bạn có thể viết gộp (3) và (4) thành một lệnh duy nhất

var view = View("/DefaultList.cshtml", model);

EP 1 Complete Employees Management System Using ASPNET Core MVC, EF Core,SQL|AdminLTE| Perform CRUD💥
EP 1 Complete Employees Management System Using ASPNET Core MVC, EF Core,SQL|AdminLTE| Perform CRUD💥

Phản hồi

Gửi và xem ý kiến phản hồi dành cho

ASP.NET Core là công nghệ phát triển ứng dụng web dựa trên hai nền tảng .NET Framework và .NET Core của Microsoft (Phân biệt .NET Core và .NET Framework có thể tham khảo tại https://ngocminhtran.com/2020/02/09/net-core-ung-dung-console-dau-tien-va-cach-debug/ ). MVC (Model View Controller) là mô hình phổ biến dùng để tách bạch dữ liệu, quy tắc nghiệp vụ và giao diện người dùng trong các dự án phát triển web. Công nghệ ASP.NET dựa trên hai nền tảng hoàn toàn khác nhau: ASP.NET (phiên bản 4.X trở về trước) dựa trên .NET Framework và ASP.NET Core dựa trên .NET Core. Bài viết này là bài viết đầu tiên trong loạt bài viết giới thiệu về ASP.NET Core MVC hướng tới xây dựng một ứng dụng web sử dụng môi trường Visual Studio 2019 Community.

ASP.NET Core là phiên bản tiến hóa mới nhất của công nghệ ASP.NET, kế thừa những tính năng nổi trội từ ASP.NET cũ nhưng ASP.NET Core là nền tảng hoàn toàn mới, khác biệt so với ASP.NET trước đây. Để hiểu tại sao Microsoft lại quyết định xây dựng một nền tảng công nghệ hoàn toàn mới thay vì phát triển ASP.NET hiện có thì chúng ta cần hiểu một số ưu điểm và hạn chế của ASP.NET.

ASP.NET xuất hiện lần đầu vào năm 2002 như là một phần của .NET Framework 1.0. Ứng dụng ASP.NET lúc này là ASP.NET Web Forms cho phép tạo các ứng dụng dựa trên giao diện đồ họa và mô hình hướng sự kiện. Theo thời gian, với việc các ứng dụng ASP.NET Web Forms trở nên cồng kềnh, khó bảo trì nên đến năm 2009, Microsoft cho ra đời phiên bản ASP.NET MVC nhằm tạo các ứng dụng web dựa trên mô hình MVC. Dù có nhiều ưu điểm nổi bật hơn ASP.NET Web Forms nhưng cả hai cùng dựa vào một nền tảng với tập tin trọng tâm System.Web.dll. Sự phụ thuộc này kế thừa một số ưu điểm của .NET Framework như tính tin cậy cao và nhiều tính năng thuận tiện cho sự phát triển các ứng dụng web hiện đại trên nền tảng Windows, đồng thời cũng mang lại một số hạn chế. Sự hạn chế đầu tiên là sự thay đổi chậm chạp về nội dung trong tập tin System.Web.dll ảnh hưởng lớn đến khả năng mở rộng của ASP.NET, bên cạnh đó, các ứng dụng web hiện đại đòi hỏi thực thi đa nền (cross platform) tức là không chỉ thực thi trên Windows mà còn trên Linux hay MacOS.

Tag Helpers

Tag Helpers enable server side code to participate in creating and rendering HTML elements in Razor files. You can use tag helpers to define custom tags (for example, ) or to modify the behavior of existing tags (for example, ). Tag Helpers bind to specific elements based on the element name and its attributes. They provide the benefits of server-side rendering while still preserving an HTML editing experience.

There are many built-in Tag Helpers for common tasks – such as creating forms, links, loading assets and more – and even more available in public GitHub repositories and as NuGet packages. Tag Helpers are authored in C#, and they target HTML elements based on element name, attribute name, or parent tag. For example, the built-in LinkTagHelper can be used to create a link to the

Login

action of the

AccountsController

:

Thank you for confirming your email. Please

Click here to Log in

.

The

EnvironmentTagHelper

can be used to include different scripts in your views (for example, raw or minified) based on the runtime environment, such as Development, Staging, or Production:

Tag Helpers provide an HTML-friendly development experience and a rich IntelliSense environment for creating HTML and Razor markup. Most of the built-in Tag Helpers target existing HTML elements and provide server-side attributes for the element.

Introduction to ASP.NET MVC in C#:  Basics, Advanced Topics, Tips, Tricks, Best Practices, and More
Introduction to ASP.NET MVC in C#: Basics, Advanced Topics, Tips, Tricks, Best Practices, and More

Seed the database

Create a new class named

SeedData

in the Models folder. Replace the generated code with the following:


using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using MvcMovie.Data; using System; using System.Linq; namespace MvcMovie.Models { public static class SeedData { public static void Initialize(IServiceProvider serviceProvider) { using (var context = new MvcMovieContext( serviceProvider.GetRequiredService< DbContextOptions

>())) { // Look for any movies. if (context.Movie.Any()) { return; // DB has been seeded } context.Movie.AddRange( new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-2-12"), Genre = "Romantic Comedy", Price = 7.99M }, new Movie { Title = "Ghostbusters ", ReleaseDate = DateTime.Parse("1984-3-13"), Genre = "Comedy", Price = 8.99M }, new Movie { Title = "Ghostbusters 2", ReleaseDate = DateTime.Parse("1986-2-23"), Genre = "Comedy", Price = 9.99M }, new Movie { Title = "Rio Bravo", ReleaseDate = DateTime.Parse("1959-4-15"), Genre = "Western", Price = 3.99M } ); context.SaveChanges(); } } } }

If there are any movies in the database, the seed initializer returns and no movies are added.


if (context.Movie.Any()) { return; // DB has been seeded. }

Add the seed initializer

Replace the contents of

Program.cs

with the following code. The new code is highlighted.


using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using MvcMovie.Data; using MvcMovie.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext

(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext"))); // Add services to the container. builder.Services.AddControllersWithViews(); var app = builder.Build(); using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; SeedData.Initialize(services); } // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();

Delete all the records in the database. You can do this with the delete links in the browser or from SSOX.

Test the app. Force the app to initialize, calling the code in the

Program.cs

file, so the seed method runs. To force initialization, close the command prompt window that Visual Studio opened, and restart by pressing Ctrl+F5.

The app shows the seeded data.

The

MvcMovieContext

object handles the task of connecting to the database and mapping

Movie

objects to database records. The database context is registered with the Dependency Injection container in the

ConfigureServices

method in the

Startup.cs

file:


public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddDbContext

(options => options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext"))); }

The ASP.NET Core Configuration system reads the

ConnectionString

key. For local development, it gets the connection string from the

appsettings.json

file:


"ConnectionStrings": { "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true" }

When the app is deployed to a test or production server, an environment variable can be used to set the connection string to a production SQL Server. For more information, see Configuration.

Web APIs

In addition to being a great platform for building web sites, ASP.NET Core MVC has great support for building Web APIs. You can build services that reach a broad range of clients including browsers and mobile devices.

The framework includes support for HTTP content-negotiation with built-in support to format data as JSON or XML. Write custom formatters to add support for your own formats.

Use link generation to enable support for hypermedia. Easily enable support for Cross-Origin Resource Sharing (CORS) so that your Web APIs can be shared across multiple Web applications.

.NET Core 3.1 MVC REST API - Full Course
.NET Core 3.1 MVC REST API – Full Course

Chuyển hướng người dùng

Redriect result được dùng khi bạn muốn chuyển hướng người dùng đến một URL khác. Có 4 loại redirect result có sẵn. RedirectResult, LocalRedirectResult, RedirectToActionResult và RedirectToRouteResult.

Mỗi một redirect này có thể trả về bất cứ mã trạng thái (status code) dưới đây:

RedirectResult

RedirectResult sẽ trả về cho user bằng cách cung cấp đường dẫn tuyệt đối hoặc tương đối:

ACTION RESULT CONTROLLER METHOD STATUS CODE
RedirectResult Redirect 302 Found (Temporarily moved)
RedirectPermanent 301 Moved Permanently
RedirectPermanentPreserveMethod 308 Permanent Redirect
RedirectPreserveMethod 307 Temporary Redirect

Ví dụ:


Redirect("/Product/Index"); RedirectPermanent("/Product/Index"); RedirectPermanentPreserveMethod("/Product/Index"); RedirectPreserveMethod("/Product/Index");

Thay vào đó, bạn có thể sử dụng RedirectResult trực tiếp được định nghĩa trong Microsoft.AspNetCore.Mvc. Cú pháp là: RedirectResult(string url, bool permanent, bool preserveMethod)


return new RedirectResult(url:"/Product/Index", permanent: true, preserveMethod: true);

LocalRedirectResult

Action result này tương tự như RedirectResult nhưng chỉ khác một điều. Chỉ các local URL mới được chấp nhận. Nếu bạn cung cấp bất cứ một URL ngoài nào, phương thức này sẽ trả về một lỗi InvalidOperationException. Điều này tránh việc bị tất công open redirect attack.

ACTION RESULT CONTROLLER METHOD STATUS CODE
LocalRedirectResult LocalRedirect 302 Found (Temporarily moved)
LocalRedirectPermanent 301 Moved Permanently
LocalRedirectPermanentPreserveMethod 308 Permanent Redirect
LocalRedirectPreserveMethod 307 Temporary Redirect

Ví dụ:


LocalRedirect("/Product/Index"); LocalRedirectPermanent("/Product/Index"); LocalRedirectPermanentPreserveMethod("/Product/Index"); LocalRedirectPreserveMethod("/Product/Index");

RedirectToActionResult

Action result này chuyển client đến một action và controller cụ thể. Nó nhận một tên Action method, một tên controller và các giá trị tham số:

ACTION RESULT CONTROLLER METHOD STATUS CODE
RedirectToActionResult RedirectToAction 302 Found (Temporarily moved)
RedirectToActionPermanent 301 Moved Permanently
RedirectToActionPermanentPreserveMethod 308 Permanent Redirect
RedirectToActionPreserveMethod 307 Temporary Redirect

Ví dụ:


//Redirects to test action in AboutUsController RedirectToAction(actionName: "Index", controllerName: "AboutUs"); //Redirects to Index action in the current Controller RedirectToAction(actionName: "Index");

RedirectToRouteResult

Action result này chuyển khách hàng đến một route cụ thể. Nó nhận tên route, giá trị của route và chuyển chúng ta đến vị trí mà route cung cấp:

ACTION RESULT CONTROLLER METHOD STATUS CODE
RedirectToRouteResult RedirectToRoute 302 Found (Temporarily moved)
RedirectToRoutePermanent 301 Moved Permanently
RedirectToRoutePermanentPreserveMethod 308 Permanent Redirect
RedirectToRoutePreserveMethod 307 Temporary Redirect

Ví dụ:


// Redirect using route name return RedirectToRoute("default"); //Redirect using Route Value var routeValue = new RouteValueDictionary(new { action = "Index", controller = "Home"}); return RedirectToRoute(routeValue);

Thực hành 1 – Tự cấu hình dự án ASP.NET Core MVC

Trong phần này chúng ta sẽ tạo một dự án rỗng và cấu hình các thành phần cần thiết để tạo thành một dự án ASP.NET Core MVC cơ bản.

Bước 1. Tạo ra một dự án rỗng ASP.NET Core.

Bạn thu được một dự án rỗng ASP.NET Core với cấu trúc file như sau:

Bước 2. Mở file Startup.cs và viết code như sau:

using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace WebApplication1 { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute(“default”, “{controller=Default}/{action=Index}/{id?}”); }); } } }

Ở bước này chúng ta thực hiện hai thay đổi:

(1) Thêm lời gọi services.AddControllersWithViews(); vào phương thức ConfigureServices.

Nếu bạn đọc các tài liệu cũ hơn về ASP.NET Core MVC trước phiên bản 2.1 bạn có thể gặp phương thức AddMvc(). Từ ASP.NET Core MVC 3.0 chuyển sang sử dụng AddControllersWithViews().

(2) Điều chỉnh thân hàm lambda tham số của UseEndpoints thành endpoints.MapControllerRoute(“default”, “{controller=Default}/{action=Index}/{id?}”);

Đây là cấu hình mẫu routing mặc định cho ứng dụng ASP.NET Core MVC. Mẫu này quy định rằng phần path của một Url hợp lệ phải có dạng controller/action/id. Trong đó:

  • controller là tên của lớp controller, action là tên của phương thức action trong controller, id là tham số của action.
  • nếu không chỉ định controller thì mặc định sẽ gọi tới DefaultController; nếu không chỉ định action thì mặc định sẽ tìm tới phương thức Index trong DefaultController;
  • id là không bắt buộc.

Bạn sẽ quay lại với nội dung routing trong một bài học riêng.

Bước 3. Tạo class DefaultController trong file cùng tên trực thuộc project và viết code như sau:

namespace WebApplication1 { public class DefaultController : Controller { public string Index(string id) { if (string.IsNullOrEmpty(id)) return “Welcome to ASP.NET Core MVC”; else return $”Hello, {id}! Welcome to ASP.NET Core MVC”; } } }

Khi chạy chương trình bạn sẽ thu được kết quả như sau (lưu ý cách viết Url):

Lý do liên quan đến mẫu routing chúng ta khai báo.

Nếu path có 2 segment, segment thứ nhất tương ứng với tên controller, segment thứ hai tương ứng với tên action trong controller đó. Như vậy /default/index tương ứng với gọi tới phương thức Index trong class DefaultController.

Nếu không nhìn thấy segment thứ hai (tương đương với tên action), giá trị “index” sẽ được sử dụng. Nếu không nhìn thấy segment đầu, giá trị “default” sẽ được sử dụng. Như vậy action Index trong DefaultController tương ứng với url /default/index hoặc /. Nếu thêm chuỗi truy vấn ?id=Donald Trump vào Url sẽ thu được kết quả như sau:

Đến đây bạn đã xây dựng được một ứng dụng ASP.NET Core MVC đơn giản nhất!

Trong phần này bạn đã cấu hình cho dự án ASP.NET Core hoạt động theo mô hình kiến trúc MVC. Bạn cũng đã xây dựng lớp controller đầu tiên với một action Index.

.NET 8 Web API & Entity Framework 🚀 Full CRUD Course (with Code-First Migrations & SQL Server)
.NET 8 Web API & Entity Framework 🚀 Full CRUD Course (with Code-First Migrations & SQL Server)

Về tác giả

Bài viết này được cung cấp bởi MVP Lê Hoàng Dũng. Microsoft chân thành cảm ơn những MVP đã chia xẻ những kinh nghiệm chuyên môn của mình với những người sử dụng khác. Bài viết này sẽ được đăng trên website hoặc blog của MVP sau đây. Nếu bạn muốn xem các bài viết khác được chia xẻ bởi MVP, vui lòng nháy chuột vào đây.

Routing

ASP.NET Core MVC is built on top of ASP.NET Core’s routing, a powerful URL-mapping component that lets you build applications that have comprehensible and searchable URLs. This enables you to define your application’s URL naming patterns that work well for search engine optimization (SEO) and for link generation, without regard for how the files on your web server are organized. You can define your routes using a convenient route template syntax that supports route value constraints, defaults and optional values.

Convention-based routing enables you to globally define the URL formats that your application accepts and how each of those formats maps to a specific action method on a given controller. When an incoming request is received, the routing engine parses the URL and matches it to one of the defined URL formats, and then calls the associated controller’s action method.


routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");

Attribute routing enables you to specify routing information by decorating your controllers and actions with attributes that define your application’s routes. This means that your route definitions are placed next to the controller and action with which they’re associated.


[Route("api/[controller]")] public class ProductsController : Controller { [HttpGet("{id}")] public IActionResult GetProduct(int id) { ... } }

Learn ASP.NET Core MVC (.NET 6) - Full Course
Learn ASP.NET Core MVC (.NET 6) – Full Course

Trả về HTML

Có 2 Action result trả về HTML Response. ViewResult và PartialViewResult.

ViewResult

Phương thức View() tìm kiếm View trong thư mục Views/

để tìm file .cshtml và chuyển nó cho Razor View Engine. Bạn có thể gán cho nó model dữ liệu. View sẽ trả về một ViewResult và kết quả là một HTML Response.

Mở HomeController và copy đoạn code sau:


public ActionResult Index() { var movie = new Movie() { Name = "Avatar" }; return View(movie); }

Phương thức Index gọi View() sẽ trả về một ViewResult.

PartialViewResult

PartialView Result sử dụng model để tạo ra một phần của View. Chúng ta sử dụng ViewResult để tạo ra một view hoàn chỉnh còn PartialView trả về một phần của View. Kiểu trả về này hữu ích với Single Page Application (SPA) ki bạn muốn cập nhật một phần của View thông qua AJAX.


public ActionResult Index() { var movie = new Movie() { Name = "Avatar" }; return PartialView(movie); }

Cách ASP.NET Core làm việc

Người dùng từ trình duyệt web muốn gửi một yêu cầu đến ứng dụng ASP.NET Core cũng phải thông qua giao thức HTTP. Nhưng thay vì yêu cầu được gửi trực tiếp đến server (hay web server), nó phải thông qua một reverse-proxy server. Hiểu một cách đơn giản, một reverse-proxy server là một phần mềm có trách nhiệm nhận và chuyển tiếp yêu cầu từ người dùng đến server (hay web server). Các reverse-proxy server được công khai trên internet nhưng các web server thì chỉ có reverse-proxy server biết. Điều này làm tăng tính bảo mật và khả năng thực thi của các web server. Phần mềm reverse-proxy server trên Windows là IIS, trên Linux hay MacOS có thể là NGHINX hay Apache. Các bước thực thi được mô tả như hình sau đây:

Ở đây, ASP.NET Core web server là Kestrel, một web server thực thi đa nền (cross-platform). Tham khảo thêm về Kestrel tại https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1

Introduction to ASP.NET Core MVC (.NET 8)
Introduction to ASP.NET Core MVC (.NET 8)

ASP.NET Core là gì?

.NET Core là một nền tảng mã nguồn mở được Microsoft giới thiệu lần đầu tiên năm 2014 và trở thành một trong những nền tảng phổ biến nhất hiện nay (có thể tham khảo thêm tại https://ngocminhtran.com/2020/02/09/net-core-ung-dung-console-dau-tien-va-cach-debug/ ). Với .NET Core, Microsoft có thể xây dựng một nền tảng công nghệ web thỏa mãn 4 mục tiêu:

  • Thực thi và phát triển đa nền (Linux, Windows, MacOS)
  • Kiến trúc mô đun để dễ dàng bảo trì
  • Phát triển như phần mềm mã nguồn mở
  • Tương thích với khuynh hướng phát triển web hiện tại như ứng dụng hướng client hay môi trường đám mây

Và ASP.NET Core – tức công nghệ ASP.NET kế thừa nền tảng cũ .NET Framework và phát triển thêm những tính năng mới trên nền tảng .NET Core – ra đời.

Hình ảnh mô tả mối quan hệ giữa các nền tảng công nghệ web của Microsoft

.NET Core là nền tảng hoàn toàn mới nhưng chia sẻ nhiều thư viện (API) giống nền tảng .NET Framework chỉ có điều các thư viện trong .NET Core có kích thước nhỏ hơn với mục đích cung cấp một mô hình lập trình và thực thi ứng dụng đơn giản hơn.

This tutorial teaches ASP.NET Core MVC web development with controllers and views. If you’re new to ASP.NET Core web development, consider the Razor Pages version of this tutorial, which provides an easier starting point. See Choose an ASP.NET Core UI, which compares Razor Pages, MVC, and Blazor for UI development.

This is the first tutorial of a series that teaches ASP.NET Core MVC web development with controllers and views.

At the end of the series, you’ll have an app that manages and displays movie data. You learn how to:

The Visual Studio Code instructions use the .NET CLI for ASP.NET Core development functions such as project creation. You can follow these instructions on macOS, Linux, or Windows and with any code editor. Minor changes may be required if you use something other than Visual Studio Code.

Change to the directory (cd) that will contain the project.

Run the following commands:

dotnet new mvc -o MvcMovie
code -r MvcMovie

The dotnet new command creates a new ASP.NET Core MVC project in the MvcMovie folder.

The code command opens the MvcMovie project folder in the current instance of Visual Studio Code.

Visual Studio Code might display a dialog box that asks: Do you trust the authors of the files in this folder?

If you trust all files in the parent folder, select Trust the authors of all files in the parent folder.

Select Yes, I trust the authors since the project folder has files generated by .NET.

When Visual Studio Code requests that you add assets to build and debug the project, select Yes. If Visual Studio Code doesn’t offer to add build and debug assets, select View > Command Palette and type “.NET” into the search box. From the list of commands, select the .NET: Generate Assets for Build and Debug command.

Visual Studio Code adds a .vscode folder with generated launch.json and tasks.json files.

Select File > New Project….

Select Web and Console > App > Web Application (Model-View-Controller) > Continue.

In the Configure your new Web Application (Model-View-Controller) dialog:

Select .NET 8.0 for the Target Framework.

Verify that Do not use top-level statements is unchecked.

Select Continue.

Enter MvcMovie for Project name. It’s important to name the project MvcMovie. Capitalization needs to match each namespace when code is copied.

Visual Studio runs the app and opens the default browser.

The address bar shows localhost: and not something like example.com. The standard hostname for your local computer is localhost. When Visual Studio creates a web project, a random port is used for the web server.

Launching the app without debugging by selecting Ctrl+F5 allows you to:

Make code changes.

Save the file.

Quickly refresh the browser and see the code changes.

You can launch the app in debug or non-debug mode from the Debug menu:

You can debug the app by selecting the https button in the toolbar:

The following image shows the app:

Select F5 to run the app.

Trust the HTTPS development certificate by running the following command:

dotnet dev-certs https –trust

The preceding command doesn’t work on Linux. See your Linux distribution’s documentation for trusting a certificate.

The preceding command displays the following dialog, provided the certificate was not previously trusted:

Select Yes if you agree to trust the development certificate.

This tutorial teaches ASP.NET Core MVC web development with controllers and views. If you’re new to ASP.NET Core web development, consider the Razor Pages version of this tutorial, which provides an easier starting point. See Choose an ASP.NET Core UI, which compares Razor Pages, MVC, and Blazor for UI development.

This is the first tutorial of a series that teaches ASP.NET Core MVC web development with controllers and views.

At the end of the series, you’ll have an app that manages and displays movie data. You learn how to:

The Visual Studio Code instructions use the .NET CLI for ASP.NET Core development functions such as project creation. You can follow these instructions on macOS, Linux, or Windows and with any code editor. Minor changes may be required if you use something other than Visual Studio Code.

Change to the directory (cd) that will contain the project.

Run the following commands:

dotnet new mvc -o MvcMovie
code -r MvcMovie

The dotnet new command creates a new ASP.NET Core MVC project in the MvcMovie folder.

The code command opens the MvcMovie project folder in the current instance of Visual Studio Code.

Visual Studio Code might display a dialog box that asks: Do you trust the authors of the files in this folder?

If you trust all files in the parent folder, select Trust the authors of all files in the parent folder.

Select Yes, I trust the authors since the project folder has files generated by .NET.

When Visual Studio Code requests that you add assets to build and debug the project, select Yes. If Visual Studio Code doesn’t offer to add build and debug assets, select View > Command Palette and type “.NET” into the search box. From the list of commands, select the .NET: Generate Assets for Build and Debug command.

Visual Studio Code adds a .vscode folder with generated launch.json and tasks.json files.

Start Visual Studio for Mac and select File > New Project….

In Visual Studio for Mac select Web and Console > App > Web Application (Model-View-Controller) > Continue.

In the Configure your new Web Application (Model-View-Controller) dialog:

Select .NET 7.0 for the Target Framework.

Verify that Do not use top-level statements is unchecked.

Select Continue.

Enter MvcMovie for Project name. It’s important to name the project MvcMovie. Capitalization needs to match each namespace when code is copied.

Visual Studio runs the app and opens the default browser.

The address bar shows localhost: and not something like example.com. The standard hostname for your local computer is localhost. When Visual Studio creates a web project, a random port is used for the web server.

Launching the app without debugging by selecting Ctrl+F5 allows you to:

Make code changes.

Save the file.

Quickly refresh the browser and see the code changes.

You can launch the app in debug or non-debug mode from the Debug menu:

You can debug the app by selecting the https button in the toolbar:

The following image shows the app:

Select F5 to run the app.

Trust the HTTPS development certificate by running the following command:

dotnet dev-certs https –trust

The preceding command doesn’t work on Linux. See your Linux distribution’s documentation for trusting a certificate.

The preceding command displays the following dialog, provided the certificate was not previously trusted:

Select Yes if you agree to trust the development certificate.

This tutorial teaches ASP.NET Core MVC web development with controllers and views. If you’re new to ASP.NET Core web development, consider the Razor Pages version of this tutorial, which provides an easier starting point. See Choose an ASP.NET Core UI, which compares Razor Pages, MVC, and Blazor for UI development.

This is the first tutorial of a series that teaches ASP.NET Core MVC web development with controllers and views.

At the end of the series, you’ll have an app that manages and displays movie data. You learn how to:

The Visual Studio Code instructions use the .NET CLI for ASP.NET Core development functions such as project creation. You can follow these instructions on macOS, Linux, or Windows and with any code editor. Minor changes may be required if you use something other than Visual Studio Code.

For Visual Studio for Mac, see the .NET 7 version of this tutorial.

Change to the directory (cd) that will contain the project.

Run the following commands:

dotnet new mvc -o MvcMovie
code -r MvcMovie

The dotnet new command creates a new ASP.NET Core MVC project in the MvcMovie folder.

The code command opens the MvcMovie project folder in the current instance of Visual Studio Code.

Visual Studio Code might display a dialog box that asks: Do you trust the authors of the files in this folder?

If you trust all files in the parent folder, select Trust the authors of all files in the parent folder.

Select Yes, I trust the authors since the project folder has files generated by .NET.

When Visual Studio Code requests that you add assets to build and debug the project, select Yes. If Visual Studio Code doesn’t offer to add build and debug assets, select View > Command Palette and type “.NET” into the search box. From the list of commands, select the .NET: Generate Assets for Build and Debug command.

Visual Studio Code adds a .vscode folder with generated launch.json and tasks.json files.

For Visual Studio for Mac, see the .NET 7 version of this tutorial.

Visual Studio runs the app and opens the default browser.

The address bar shows localhost: and not something like example.com. The standard hostname for your local computer is localhost. When Visual Studio creates a web project, a random port is used for the web server.

Launching the app without debugging by selecting Ctrl+F5 allows you to:

Make code changes.

Save the file.

Quickly refresh the browser and see the code changes.

You can launch the app in debug or non-debug mode from the Debug menu:

You can debug the app by selecting the MvcMovie button in the toolbar:

The following image shows the app:

Select Ctrl+F5 to run without the debugger.

Trust the HTTPS development certificate by running the following command:

dotnet dev-certs https –trust

The preceding command doesn’t work on Linux. See your Linux distribution’s documentation for trusting a certificate.

The preceding command displays the following dialog, provided the certificate was not previously trusted:

Select Yes if you agree to trust the development certificate.

This tutorial teaches ASP.NET Core MVC web development with controllers and views. If you’re new to ASP.NET Core web development, consider the Razor Pages version of this tutorial, which provides an easier starting point. See Choose an ASP.NET Core UI, which compares Razor Pages, MVC, and Blazor for UI development.

This is the first tutorial of a series that teaches ASP.NET Core MVC web development with controllers and views.

At the end of the series, you’ll have an app that manages and displays movie data. You learn how to:

The Visual Studio Code instructions use the .NET CLI for ASP.NET Core development functions such as project creation. You can follow these instructions on macOS, Linux, or Windows and with any code editor. Minor changes may be required if you use something other than Visual Studio Code.

Change to the directory (cd) that will contain the project.

Run the following commands:

dotnet new mvc -o MvcMovie
code -r MvcMovie

The dotnet new command creates a new ASP.NET Core MVC project in the MvcMovie folder.

The code command opens the MvcMovie project folder in the current instance of Visual Studio Code.

Visual Studio Code might display a dialog box that asks: Do you trust the authors of the files in this folder?

If you trust all files in the parent folder, select Trust the authors of all files in the parent folder.

Select Yes, I trust the authors since the project folder has files generated by .NET.

When Visual Studio Code requests that you add assets to build and debug the project, select Yes. If Visual Studio Code doesn’t offer to add build and debug assets, select View > Command Palette and type “.NET” into the search box. From the list of commands, select the .NET: Generate Assets for Build and Debug command.

Visual Studio Code adds a .vscode folder with generated launch.json and tasks.json files.

Select File > New Solution.

In Visual Studio for Mac earlier than version 8.6, select .NET Core > App > Web Application (Model-View-Controller) > Next. In version 8.6 or later, select Web and Console > App > Web Application (Model-View-Controller) > Next.

In the Configure your new Web Application dialog:

Confirm that Authentication is set to No Authentication.

If an option to select a Target Framework is presented, select the latest 5.x version.

Select Next.

Name the project MvcMovie, and then select Create.

The address bar shows localhost:port# and not something like example.com. The standard hostname for your local computer is localhost. When Visual Studio creates a web project, a random port is used for the web server.

Launching the app without debugging by selecting Ctrl+F5 allows you to:

Make code changes.

Save the file.

Quickly refresh the browser and see the code changes.

You can launch the app in debug or non-debug mode from the Debug menu item:

You can debug the app by selecting the IIS Express button

The following image shows the app:

Select Ctrl+F5 to run without the debugger.

Trust the HTTPS development certificate by running the following command:

dotnet dev-certs https –trust

The preceding command doesn’t work on Linux. See your Linux distribution’s documentation for trusting a certificate.

The preceding command displays the following dialog, provided the certificate was not previously trusted:

Select Yes if you agree to trust the development certificate.

The address bar shows localhost:port# and not something like example.com. The standard hostname for your local computer is localhost. When Visual Studio creates a web project, a random port is used for the web server.

You can launch the app in debug or non-debug mode from the Run menu.

This tutorial teaches ASP.NET Core MVC web development with controllers and views. If you’re new to ASP.NET Core web development, consider the Razor Pages version of this tutorial, which provides an easier starting point. See Choose an ASP.NET Core UI, which compares Razor Pages, MVC, and Blazor for UI development.

This is the first tutorial of a series that teaches ASP.NET Core MVC web development with controllers and views.

At the end of the series, you’ll have an app that manages and displays movie data. You learn how to:

The Visual Studio Code instructions use the .NET Core CLI for ASP.NET Core development functions such as project creation. You can follow these instructions on any platform (macOS, Linux, or Windows) and with any code editor. Minor changes may be required if you use something other than Visual Studio Code. For more information on installing Visual Studio Code on macOS, see Visual Studio Code on macOS.

Change directories (cd) to a folder that will contain the project.

Run the following command:

dotnet new mvc -o MvcMovie
code -r MvcMovie

A dialog box appears with Required assets to build and debug are missing from ‘MvcMovie’. Add them?, select Yes.

dotnet new mvc -o MvcMovie: Creates a new ASP.NET Core MVC project in the MvcMovie folder.

code -r MvcMovie: Loads the MvcMovie.csproj project file in Visual Studio Code.

Select File > New Solution.

In Visual Studio for Mac earlier than version 8.6, select .NET Core > App > Web Application (Model-View-Controller) > Next. In version 8.6 or later, select Web and Console > App > Web Application (Model-View-Controller) > Next.

In the Configure your new Web Application dialog:

Confirm that Authentication is set to No Authentication.

If an option to select a Target Framework is presented, select the latest 3.x version.

Select Next.

Name the project MvcMovie, and then select Create.

The address bar shows localhost:port# and not something like example.com. The standard hostname for your local computer is localhost. When Visual Studio creates a web project, a random port is used for the web server.

Launching the app without debugging by selecting Ctrl+F5 allows you to:

Make code changes.

Save the file.

Quickly refresh the browser and see the code changes.

You can launch the app in debug or non-debug mode from the Debug menu item:

You can debug the app by selecting the IIS Express button

The following image shows the app:

Select Ctrl+F5 to run the app without debugging.

Trust the HTTPS development certificate by running the following command:

dotnet dev-certs https –trust

The preceding command doesn’t work on Linux. See your Linux distribution’s documentation for trusting a certificate.

The preceding command displays the following dialog, provided the certificate was not previously trusted:

Select Yes if you agree to trust the development certificate.

The address bar shows localhost:port# and not something like example.com. The standard hostname for your local computer is localhost. When Visual Studio creates a web project, a random port is used for the web server. When you run the app, you’ll see a different port number.

You can launch the app in debug or non-debug mode from the Run menu.

Dự án ASP.NET Core MVC có thể được tạo ra trong Visual Studio với template Web Application (Model – View – Controller), hoặc tạo ra từ giao diện dòng lệnh với template mvc. Bạn cũng có thể tạo một project rỗng và tự cài đặt những gì cần thiết mà không cần tới các template có sẵn.Bài học này sẽ giới thiệu cách cài đặt một dự án ASP.NET Core MVC từ project rỗng để bạn nắm được các nguyên lý chung. Sau đó chúng ta sẽ làm quen với cách tạo dự án từ Visual Studio và giao diện dòng lệnh. Cuối cùng chúng ta sẽ học về cấu trúc của một dự án ASP.NET Core MVC.

Cấu trúc một dự án ASP.NET Core MVC

Từ cửa sổ Solution Explorer, chúng ta có thể lướt qua cấu trúc tổng thể của một dự án ASP.NET Core MVC với một số thành phần sau:

  • Vị trí cao nhất trong cửa sổ Solution Explorer là thư mục gốc của dự án được lồng trong một thư mục solution. Visual Studio dùng khái niệm solution để làm việc với nhiều dự án, trong trường hợp này chỉ có một dự án. Tại thư mục này chúng ta sẽ tìm thấy một tập tin solution (có phần mở rộng .sln).
  • Kế tiếp thư mục gốc dự án là tập tin quan trọng nhất của dự án, tập tin MVCBooks.csproj.
  • Vì chúng ta đang dùng mô hình MVC nên chú ý tiếp theo của chúng ta sẽ là các thư mục Controllers, Models và Views chứa các tập tin dùng để xây dựng dự án.
  • Thư mục Properties chứa tập tin launchSettings.json kiểm soát cách Visual Studio sẽ chạy và debug ứng dụng.
  • Thư mục wwwroot là thư mục đặc biệt cho phép các trình duyệt web có thể truy cập trực tiếp đến nội dung bên trong nó như các tập tin CSS, JS, hình ảnh hay các tập tin HTML. Các trình duyệt sẽ không thể truy cập được các tập tin này nếu chúng ở bên thư mục wwwroot.
  • Properties và wwwroot được xem như là hai thư mục đặc biệt, được đặt phía trên cửa sổ Solution Explorer, gần mục dự án và không tuân theo thứ tự các chữ cái. Phía trên hai thư mục này có hai mục đặc biệt hơn gọi là Dependencies và Connected Servives chứa các thành phần phụ thuộc đến dự án như các gói NuGet, các dịch vụ từ xa, các thành phần hướng client.
  • Tập tin appsettings.json cung cấp thông tin cấu hình ứng dụng tại thời điểm thực thi hay thời điểm biên dịch.
  • Cuối cùng là hai tập tin Program.cs và Startup.cs kiểm soát cấu hình và quá trình khởi động của ứng dụng tại thời điểm thực thi. Chúng ta sẽ tìm hiểu kĩ hơn nội dung hai tập tin này.

Tập tin dự án csproj

Là tập tin quan trọng nhất của ứng dụng .NET nhưng trong ASP.NET Core, nội dung tập tin này được lược giản để dễ đọc, dễ chỉnh sửa hơn. Ví dụ nội dung MVCBooks.csproj:


netcoreapp3.1

Thuộc tính Sdk của phần tử Project xác định kiểu dự án đang xây dựng (trong trường hợp này là Web). Phần tử TargetFramework xác định framework ứng dụng đang chạy, trong trường hợp này là .NET Core 3.1.

Tập tin Program.cs

Tương tự các ứng dụng Console, dự án ASP.NET Core cũng chứa lớp Program với hàm Main nhưng mục đích của hàm này là dùng để xây dựng và thực thi một đối tượng IWebHost. IWebHost là cốt lõi ứng dụng ASP.NET Core chứa cấu hình ứng dụng và Kestrel server để lắng nghe các yêu cầu và hồi đáp đến người dùng. Nó dùng một WebHostBuilder, được tạo bằng lời gọi CreateDefaultBuilder để định nghĩa cách IWebHost được cấu hình trước khi một đối tượng IWebHost được tạo bằng lời gọi Build(). Nội dung lớp Program từ MVCBooks:

public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup

(); }); }

Tập tin Startup.cs

Tập tin này chứa lớp Startup chứa thông tin cấu hình ứng dụng dựa trên hai khía cạnh:

  • Tất cả các lớp được dùng trong ứng dụng phải được đăng ký để chúng có thể được sử dụng một cách chính xác tại thời gian thực thi.
  • Cách thức ứng dụng xử lý và hồi đáp các yêu cầu từ người dùng.

Lớp Startup từ MVCBooks:

public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to // add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); } // This method gets called by the runtime. Use this method to // configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler(“/Home/Error”); // The default HSTS value is 30 days. You may want to // change this for production scenarios, see // https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: “default”, pattern: ” {controller=Home}/{action=Index}/{id?}”); }); } }

Xử lý yêu cầu thông qua mô hình MVC

Cách thức xử lý và hồi đáp yêu cầu người dùng đã được trình bày một cách tổng quát ở trên nhưng nếu muốn xem chi tiết hơn về cách mô hình MVC xử lý thì thông qua hình ảnh sau đây:

Khi một yêu cầu được tạo đến trang Home/Index, MVC HomeController sẽ xử lý yêu cầu bằng cách thực thi phần Index action. Kết quả sẽ tạo một đối tượng ViewResult chứa dữ liệu được dùng để phát sinh nội dung HTML. Việc phát sinh nội dung HTML do trình thực thi Razor đảm nhiệm và trình thực thi này sẽ xác định các Razor template phù hợp. Các Razor template được lưu trữ trong các tập tin có phần mở rộng là cshtml được chứa trong thư mục View:

Các Razor template chứa mã HTML, C# hay mã HTML phát sinh từ mã C#, tập tin _Layout.cshtml tạo ra các thành phần chung nhất của một trang web như header hay footer.

Như vậy, thông qua bài viết đầu tiên này, chúng ta đã có một cái nhìn tổng quan và cách tạo một ứng dụng ASP.NET Core MVC. Bài viết cũng trình bày lý do chọn ASP.NET Core MVC như là một lựa chọn tối ưu cho những nhà phát triển Web vừa mới làm quen với môi trường .NET hay đang muốn xây dựng một ứng dụng ASP.NET hoàn toàn mới.

Sử dụng Visual Studio Code cho người mới bắt đầu
Sử dụng Visual Studio Code cho người mới bắt đầu

SQL Server Express LocalDB

LocalDB:

  • Is a lightweight version of the SQL Server Express Database Engine, installed by default with Visual Studio.
  • Starts on demand by using a connection string.
  • Is targeted for program development. It runs in user mode, so there’s no complex configuration.
  • By default creates .mdf files in the C:/Users/{user} directory.

Examine the database

From the View menu, open SQL Server Object Explorer (SSOX).

Right-click on the

Movie

table > View Designer

Note the key icon next to

ID

. By default, EF makes a property named

ID

the primary key.

Right-click on the

Movie

table > View Data

Areas

Areas provide a way to partition a large ASP.NET Core MVC Web app into smaller functional groupings. An area is an MVC structure inside an application. In an MVC project, logical components like Model, Controller, and View are kept in different folders, and MVC uses naming conventions to create the relationship between these components. For a large app, it may be advantageous to partition the app into separate high level areas of functionality. For instance, an e-commerce app with multiple business units, such as checkout, billing, and search etc. Each of these units have their own logical component views, controllers, and models.

Bài 1:  [Học SQL từ đầu] - Tạo database, tạo table, tạo khóa chính, khóa ngoại bằng câu lênh SQL
Bài 1: [Học SQL từ đầu] – Tạo database, tạo table, tạo khóa chính, khóa ngoại bằng câu lênh SQL

Khi nào lựa chọn ASP.NET Core

Khi quyết định chọn ASP.NET Core, cần xác định hai câu hỏi quan trọng:

  • Đây là lần đầu tiên bạn phát triển ứng dụng trên nền tảng .NET?
  • Bạn muốn tạo một ứng dụng mới hay chuyển đổi ứng dụng đã có?

Nếu bạn là trường hợp đầu tiên thì ASP.NET Core là lựa chọn hoàn hảo và vì những ưu điểm của ASP.NET Core nên nó cũng là lựa chọn hoàn hảo nếu bạn đang cân nhắc xây dựng một ứng dụng web mới (ý đầu tiên câu hỏi thứ 2). Nếu bạn muốn chuyển đổi một ứng dụng sẵn có sang nền tảng ASP.NET Core thì câu chuyện lại phức tạp hơn nhiều. Các ứng dụng dùng ASP.NET Web Forms, SignalR hay WCF thì việc chuyển đổi là không thể, nếu các ứng dụng dùng MVC hay Web API thì việc chuyển đổi đòi hỏi cập nhật thêm nhiều thông tin.

Tóm lại, nếu bạn là người mới bắt đầu phát triển một ứng dụng web dùng ASP.NET hay đang cân nhắc xây dựng một ứng dụng web hoàn toàn mới thì ASP.NET Core là lựa chọn hoàn hảo. Nếu ứng dụng sẵn có được xây dựng từ ASP.NET MVC, Web API và Razor thì việc chuyển đổi sang ASP.NET Core là khả thi.

HTTP là giao thức cốt lõi cho việc thực thi các ứng dụng web. Do đó, trước khi tìm hiểu về cách làm việc của ASP.NET Core, chúng ta cần tìm hiểu lại cách thức hoạt động của giao thức này.

Template cho dự án ASP.NET Core MVC

Trong các phần trên chúng ta tự cấu hình dự án ASP.NET Core MVC từ một dự án rỗng. Mục đích là giúp bạn hiểu rõ hơn về một dự án ASP.NET Core MVC.

Để giúp bạn có một dự án với đầy đủ các thành phần cơ bản, ASP.NET Core cung cấp sẵn mẫu dự án MVC. Bạn có thể sử dụng Visual Studio hoặc giao diện dòng lệnh để tạo dự án theo mẫu.

(1) Sử dụng Visual Studio

Nếu sử dụng Visual Studio, mẫu dự án cho MVC được đặt tên là Web Application (Model-View-Controller).

Lưu ý, template Web Application là template cho ứng dụng Razor Pages mà bạn đã học trước đây.

(2) Sử dụng giao diện dòng lệnh

Khi sử dụng giao diện dòng lệnh, tên mẫu tương ứng cho dự án ASP.NET Core MVC là mvc.

Bạn sử dụng cùng với lệnh dotnet new như sau:


dotnet new mvc -o WebApplication3

Khi sử dụng template này bạn thu được một dự án với cấu trúc như sau:

Dự án này tạo sẵn cho bạn controller đầu tiên HomeController, hai view tương ứng với hai action Index.cshtml và Privacy.cshtml.

Ngoài ra, mẫu dự án này cũng cài đặt sẵn các thư viện css/js (Bootstrap, jQuery), layout, view imports và view start. Các thành phần này giống như trong dự án Razor Pages.

ASP.NET Core MVC 6.0 Full Course (Beginner)
ASP.NET Core MVC 6.0 Full Course (Beginner)

Seed the database

Create a new class named

SeedData

in the Models folder. Replace the generated code with the following:


using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using MvcMovie.Data; using System; using System.Linq; namespace MvcMovie.Models; public static class SeedData { public static void Initialize(IServiceProvider serviceProvider) { using (var context = new MvcMovieContext( serviceProvider.GetRequiredService< DbContextOptions

>())) { // Look for any movies. if (context.Movie.Any()) { return; // DB has been seeded } context.Movie.AddRange( new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-2-12"), Genre = "Romantic Comedy", Price = 7.99M }, new Movie { Title = "Ghostbusters ", ReleaseDate = DateTime.Parse("1984-3-13"), Genre = "Comedy", Price = 8.99M }, new Movie { Title = "Ghostbusters 2", ReleaseDate = DateTime.Parse("1986-2-23"), Genre = "Comedy", Price = 9.99M }, new Movie { Title = "Rio Bravo", ReleaseDate = DateTime.Parse("1959-4-15"), Genre = "Western", Price = 3.99M } ); context.SaveChanges(); } } }

If there are any movies in the database, the seed initializer returns and no movies are added.


if (context.Movie.Any()) { return; // DB has been seeded. }

Add the seed initializer

Replace the contents of

Program.cs

with the following code. The new code is highlighted.


using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using MvcMovie.Data; using MvcMovie.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext

(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext"))); // Add services to the container. builder.Services.AddControllersWithViews(); var app = builder.Build(); using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; SeedData.Initialize(services); } // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();

Delete all the records in the database. You can do this with the delete links in the browser or from SSOX.

Test the app. Force the app to initialize, calling the code in the

Program.cs

file, so the seed method runs. To force initialization, close the command prompt window that Visual Studio opened, and restart by pressing Ctrl+F5.

The app shows the seeded data.

The

MvcMovieContext

object handles the task of connecting to the database and mapping

Movie

objects to database records. The database context is registered with the Dependency Injection container in the

Program.cs

file:


var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext

(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

The ASP.NET Core Configuration system reads the

ConnectionString

key. For local development, it gets the connection string from the

appsettings.json

file:


"ConnectionStrings": { "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db" }

When the app is deployed to a test or production server, an environment variable can be used to set the connection string to a production SQL Server. For more information, see Configuration.

Model validation

ASP.NET Core MVC supports validation by decorating your model object with data annotation validation attributes. The validation attributes are checked on the client side before values are posted to the server, as well as on the server before the controller action is called.


using System.ComponentModel.DataAnnotations; public class LoginViewModel { [Required] [EmailAddress] public string Email { get; set; } [Required] [DataType(DataType.Password)] public string Password { get; set; } [Display(Name = "Remember me?")] public bool RememberMe { get; set; } }

A controller action:


public async Task

Login(LoginViewModel model, string returnUrl = null) { if (ModelState.IsValid) { // work with the model } // At this point, something failed, redisplay form return View(model); }

The framework handles validating request data both on the client and on the server. Validation logic specified on model types is added to the rendered views as unobtrusive annotations and is enforced in the browser with jQuery Validation.

ASP.NET Core MVC CRUD Operations using .NET 8 and Entity Framework Core - MVC For Beginners Tutorial
ASP.NET Core MVC CRUD Operations using .NET 8 and Entity Framework Core – MVC For Beginners Tutorial

Action Result là gì?

Controller Action sẽ trả về kết quả cho client. Client có thể mong muốn một kết quả đơn giản như là chuỗi hay số nguyên hoặc một kết quả phức tạp như là JSON hay HTML view hoặc file để download.

Controller trong ASP.NET Core chỉ đơn giản là các class C#. Nó không cần phải kế thừa từ bất cứ base class nào.Nhưng ASP.NET Core cung cấp một class Controller nó kế thừa từ một ControllerBase class. Điều này giúp class cung cấp rất nhiều các method hữu ích, nó giúp Controller làm việc dễ dàng hơn. Vì thế thông thường các controller của chúng ta đều kế thừa từ Controller class.

Controller Base class triển khai các loại Action Result khác nhau sẵn có giúp xây dựng các loại kết quả trả về khác nhau cho client. Ví dụ, ViewResult trả về một HTML response. Một RedirectResult chuyển hướng đến URL khác. Content Result trả về một chuỗi văn bản. Các kiểu trả về này được biết đến là Action Result.

Các loại Action Result

Có nhiều loại Action Result có sẵn trong Microsoft.AspNetCore.Mvc namespace. Nó được phân loại theo công năng sử dụng:

  1. Trả về HTML
  2. Chuyển hướng người dùng
  3. Trả về file
  4. Trả về nội dung văn bản
  5. Trả về lỗi và HTTP Code
  6. Kết quả liên quan đến bảo mật

ASP.NET Core MVC

The ASP.NET Core MVC framework is a lightweight, open source, highly testable presentation framework optimized for use with ASP.NET Core.

ASP.NET Core MVC provides a patterns-based way to build dynamic websites that enables a clean separation of concerns. It gives you full control over markup, supports TDD-friendly development and uses the latest web standards.

Trả về lỗi và HTTP Code

Loại Action result này được dùng trong Web API Controller. Kết quả sẽ được gửi về kèm HTTP Status Code. Một trong số chúng thì có thể gửi một đối tượng vào response.

StatusCodeResult

StatusCodeResult gửi kết quả và chỉ ra một HTTP Status code:


return StatusCode(200); hoặc return new StatusCodeResult(200);

ObjectResult

Action result này sẽ trả về một đối tượng kèm một HTTP Status Code là 200. Nó là một overload của method StatusCode


return StatusCode(200, new { message = "Hello" }); hoặc return new ObjectResult(new { message = "Hello" });

OkResult

Action result này trả về nguyên chỉ có HTTP Status code 200:


return Ok(); hoặc return new OkResult();

OkObjectResult

Action result này trả về một HTTP Status code 200:


return Ok(new {message="Hello"}); hoặc return new OkObjectResult(new { message = "Not found" });

CreatedResult

CreatedResult sử dụng khi một tài nguyên được tạo ra sau request Post. Nó gửi trạng thái 201 về kèm đối tượng vừa được tạo:


return Created(new Uri("/Home/Index", UriKind.Relative), new {message="Hello World"}); hoặc return new CreatedResult(new Uri("/Home/Index", UriKind.Relative), new { message = "Hello World" });

CreatedAtActionResult

Cái này tương tự CreatedResult nhưng nó nhận vào Controller và Action thay vì URL:


return CreatedAtAction("Index", new {message="Hello World"});

CreateAtRouteResult

Action Result này nhận vào gái trị route và tương tự như CreatedResult và CreatedAtActionResult


CreatedAtRoute("default", new { mesage = "Hello World" });

BadRequestResult

Action result này gửi về một HTTP Status code 400 cho client. Sử dụng response status code này khi chỉ ra cú pháp không đúng hoặc một request không được rõ ràng.


return BadRequest()

BadRequestObjectResult

Action result này tương tự BadRequestResult. Khác nhau là bạn có thể gửi về một ModelStateDictionary (chứa chi tiết lỗi) và cũng là status 400:


var modelState = new ModelStateDictionary(); modelState.AddModelError("message", "errors found. Please rectify before continuing"); return BadRequest(modelState);

Phương thức BadRequest có một overload thứ 2, trả về một BadRequestObjectResult

NotFoundResult

Action result này trả về lỗi HTTP 404 cho client:


return NotFound();

NotFoundObjectResult

Action result này tương tự nuhw NotFoundResult nhưng trả về một đuối tượng kèm lỗi 404. Overload thứ 2 của NotFound giúp nhận một đối tượng làm tham số để trả về NotFoundObjectResult.


return NotFound( new { message = "Not found" });

UnsupportedMediaTypeResult

Action result này gửi về lỗi HTTP 415. Sử dụng action result này khi request với định dạng không được hỗ trợ bởi server.


return new UnsupportedMediaTypeResult();

NoContentResult

Action result này gửi lỗi HTTP 204 về. Sử dụng NoContentResult này khi request thành công nhưng không có nội dung nào được trả về


return NoContent();

Razor view engine

ASP.NET Core MVC views use the Razor view engine to render views. Razor is a compact, expressive and fluid template markup language for defining views using embedded C# code. Razor is used to dynamically generate web content on the server. You can cleanly mix server code with client side content and code.

    @for (int i = 0; i < 5; i++) {

  • List item @i
  • }

Using the Razor view engine you can define layouts, partial views and replaceable sections.

Kết quả liên quan bảo mật

SignInResult

SignInResult là kết quả của hành động đăng nhập. SignInManager.SignInAsync hoặc PasswordSignInAsync trả về một SignInResult. Nó có 4 thuộc tính là Succeeded, IsLockedOut, IsNotAllowed và RequiresTwoFactor

Bạn có thể tham khảo về ASP.NET Identity Core.

SignOutResult

SignOutResult là kết quả của hành động logout

ForbitResult

ForbitResult trả về lỗi 403 tức là người dùng không được cấp quyền để thực hiện một hành động nào đó trên tài nguyên nào đó. ForbitResult không có nghĩa là người dùng chưa chứng thực. Người dùng chưa chứng thực nên trả về ChallengeResult hoặc UnAuthorisedResult.


return new ForbidResult(); hoặc return Forbid();

Forbit là phương thức của Controller base class trả về thể hiện của ForbidResult. Thay vào đó bạn có thể trả về Status Code:


return StatusCode(403);

ChallengeResult

ChallengeResult trả về khi chứng thực thất bại. Kết quả sẽ không gọi đến baatscuws middleware nào để tạo response. Ví dụ trả về lỗi 401 (Unauthorized) hoặc 403 (Forbidden) hoặc chuyển hướng người dùng đến trang đăng nhập.

UnauthorizedResult

UnauthorizedResult trả về lỗi “401 – Unauthorized”. Controller sử dụng phương thức Unauthorized để trả về thể hiện của UnauthorizedResult.


return Unauthorized(); hoặc return new UnauthorizedResult();

Khác nhau giữa UnauthorizedResult và ChallengeResult là một thằng trả về Status Code còn 1 thằng là không làm gì với nó.

Trích nguồn từ: (https://www.tektutorialshub.com/)

Kiểu trả về

Phương thức Index ở trên trả về một ContentResult. Cách ưa chuộng hơn là sử dụng ActionResult như là một kiểu trả về:


public ActionResult Index() { return Content("Hello"); }

Trả về ActionResult thay vì kiểu thực tế giúp chúng ta sử dụng bất cứ Action Result nào:


public ActionResult Index(int id) { if (id==0) { return NotFound(); } else { return Content("Hello"); } }

Phương thức Index trả về 2 kiểu Action Result là NotFoundResult và ContentResult phụ thuộc giá trị của tham số id.

Một số quy ước trong dự án ASP.NET Core MVC

Trong hai phần thực hành trên chúng ta tạo controller và view trực tiếp trong thư mục dự án. Nếu bạn chỉ có một vài file thì điều này không gây ra vấn đề gì.

Nếu số lượng file tăng lên, bạn cần tổ chức các file và thư mục trong dự án cho phù hợp.

Ngoài ra, ASP.NET Core MVC đưa ra một số yêu cầu về tổ chức file để đơn giản hóa việc cấu hình. Cấu hình dựa trên quy ước (configuration over convention) là một trong những cách cấu hình được nhiều framework lựa chọn để đơn giản hóa việc lập trình.

Đối với ASP.NET Core MVC cũng có nhiều quy ước cho cấu hình như vậy. Chúng ta sẽ lần lượt gặp trong những bài học cụ thể.

Trước mắt chúng ta làm quen với một số quy ước đơn giản nhất.

(1) Các lớp controller nên đặt trong thư mục Controllers trực thuộc dự án

Đây chỉ là một quy ước về tổ chức code.

Thực ra không có quy định nào bắt buộc về nơi đặt các lớp controller.

(2) Tên lớp controller cần có hậu tố “Controller”

Đây có thể xem vừa là một quy ước, vừa là một yêu cầu bắt buộc.

ASP.NET Core MVC yêu cầu các lớp controller phải thỏa mãn một trong hai yêu cầu: (1) Kế thừa từ lớp cha Controller hoặc ControllerBase; (2) Nếu không phải lớp dẫn xuất của Controller (hoặc ControllerBase) thì tên gọi phải có hậu tố Controller.

Bạn sẽ biết lý do của các yêu cầu này trong bài học riêng về controller trong ASP.NET Core MVC.

(3) Các file Razor view nên đặt trong thư mục Views trực thuộc dự án

Quy ước này liên quan đến cách ASP.NET Core MVC tìm file view cho action tương ứng.

Mặc định, ASP.NET Core MVC xác định file view như sau /Views/{Controller}/{Action}.cshtml

Ví dụ, với action List trong controller DefaultController, ASP.NET Core MVC cho rằng file Razor view tương ứng sẽ là /Views/Default/List.cshtml. Nếu không chỉ định bất kỳ thông tin gì khác về view (như tên hay đường dẫn), ASP.NET Core MVC sẽ tự tìm file tương ứng.

Chúng ta sẽ quay lại với vấn đề này trong bài học riêng về view trong ASP.NET Core MVC.

Tóm tắt thông tin

Tổng quan về ASP.NET MVC Mẫu kiến trúc Model – View – Controller được sử dụng nhằm chi ứng dụng thành ba thành phần chính: model, view và controller. Nền tảng ASP.NET MVC giúp cho chúng ta có thể tạo được các ứng dụng web áp dụng mô hình MVC thay vì tạo ứng dụng theo mẫu ASP.NET Web Forsm. Nền tảng ASP.NET MVC có đặc điểm nổi bật là nhẹ (lighweigt), dễ kiểm thử phần giao diện (so với ứng dụng Web Forms), tích hợp các tính năng có sẵn của ASP.NET. Nền tảng ASP.NET MVC được định nghĩa trong namespace System.Web.Mvc và là một phần của name space System.Web.MVC là một mẫu thiết kế (design pattern) chuẩn mà nhiều lập trình viên đã quen thuộc. Một số loại ứng dụng web sẽ thích hợp với kiến trúc MVC. Một số khác vẫn thích hợp với ASP.NET Web Forms và cơ chế postbacks. Đôi khi có những ứng dụng kết hợp cả hai kiến trúc trên.Nền tảng MVC bao gồm các thành phần dưới đây:Hình 01: Mẫu Model – View – ControllerModels: Các đối tượng Models là một phần của ứng dụng, các đối tượng này thiết lập logic của phần dữ liệu của ứng dụng. Thông thường, các đối tượng model lấy và lưu trạng thái của model trong CSDL. Ví dụ như, một đối tượng Product (sản phẩm) sẽ lấy dữ liệu từ CSDL, thao tác trên dữ liệu và sẽ cập nhật dữ liệu trở lại vào bảng Products ở SQL Server.Trong các ứng dụng nhỏ, model thường là chỉ là một khái niệm nhằm phân biệt hơn là được cài đặt thực thụ, ví dụ, nếu ứng dụng chỉ đọc dữ liệu từ CSDL và gởi chúng đến view, ứng dụng khong cần phải có tầng model và các lớp lien quan. Trong trường hợp này, dữ liệu được lấy như là một đối tượng model (hơn là tầng model).Views: Views là các thành phần dùng để hiển thị giao diện người dùng (UI). Thông thường, view được tạo dựa vào thông tin dữ liệu model. Ví dụ như, view dùng để cập nhật bảng Products sẽ hiển thị các hộp văn bản, drop-down list, và các check box dựa trên trạng thái hiện tại của một đối tượng Product.Controllers: Controller là các thành phần dùng để quản lý tương tác người dùng, làm việc với model và chọn view để hiển thị giao diện người dùng. Trong một ứng dụng MVC, view chỉ được dùng để hiển thị thông tin, controller chịu trách nhiệm quản lý và đáp trả nội dung người dùng nhập và tương tác với người dùng. Ví dụ, controller sẽ quản lý các dữ liệu người dùng gởi lên (query-string values) và gởi các giá trị đó đến model, model sẽ lấy dữ liệu từ CSDL nhờ vào các giá trị này.Mẫu MVC giúp bạn tạo được các ứng dụng mà chúng phân tách rạch ròi các khía cạnh của ứng dụng (logic về nhập liệu, logic xử lý tác vụ và logic về giao diện). Mẫu MVC chỉ ra mỗi loại logic kể trên nên được thiếp lập ở đâu trên ứng dụng. Logic giao diện (UI logic) thuộc về views. Logic nhập liệu (input logic) thuộc về controller. Và logic tác vụ (Business logic – là logic xử lý thông tin, mục đích chính của ứng dụng) thuộc về model. Sự phân chia này giúp bạn giảm bớt được sự phức tạp của ứng dụng và chỉ tập trung vào mỗi khía cạnh cần được cài đặt ở mỗi thời điểm. Ví dụ như bạn chỉ cần tập trung vào giao diện (views) mà không phải quan tâm đến logic xử lý thông tin của ứng dụng.Để quản lý sự phức tạp của ứng dụng, mẫu MVC giúp cho chúng ta có thể kiểm thử ứng dụng dễ dàng hơn hẳn so với khi áp dụng mẫu Web Forms. Ví dụ, trong một ứng dụng ASP.NET Web Forms, một lớp thường được sử dụng để hiển thị thông tin xuất ra cho người dùng và đồng thời xử lý thông tin người dùng nhập. Việc xây dựng các bộ test tự động cho ứng dụng Web Forms là rất phức tạp, bởi để kiểm thử mỗi trang web, bạn phải khởi tạo đối tượng trang, khởi tạo tất cả các control được sử dụng trong trang và các lớp phụ thuộc trong ứng dụng. Và bởi vì có quá nhiều lớp cần được khởi tạo để chạy được trang, thật khó để có thể viết các test chỉ tập trung vào một khía cạnh nào đó của ứng dụng. Và vì thế, kiểm thử đối với các ứng dụng dứa trên nền tảng Web Forms sẽ khó khăn hơn nhiều so với khi áp dụng trên ứng dụng MVC. Hơn thế nữa, việc kiểm thử trên nền tảng Web Forms yêu cầu phải sử dụng đến web server. Nền tảng MVC phân tách các thành phần và sử dụng các interface (khái niệm giao diện trong lập trình hướng đối tượng), và nhờ đó có thể kiểm thử các thành phần riêng biệt trong tình trạng phân lập với các yếu tố còn lại của ứng dụng.Sự phân tách rạch ròi ba thành phần của ứng dụng MVC còn giúp cho việc lập trình diễn ra song song. Ví dụ như một lập trình viên làm việc với view, lập trình viên thứ hai lo cài đặt logic của controller và lập trình viên thứ ba có thể tập trung vào logic tác vụ của model tại cùng một thời điểm.Lựa chọn áp dụng MVC trong xây dựng ứng dụngBạn cần phải xem xét kỹ càng việc áp dụng mô hình ASP.NET MVC hay mô hình ASP.NET Web Forms khi xây dựng một ứng dụng. Mô hình MVC không phải là mô hình thay thế cho Web Forms, bạn có thể dùng một trong hai mô hình.Trước khi quyết định sử dụng MVC hay Web Forms cho một web site cụ thể, bạn cần phải phân tích lợi ích khi chọn một trong hai hướng.Lợi ích của ứng dụng web dựa trên mô hình MVCNền tảng ASP.NET MVC mang lại những lợi ích sau:

  • Dễ dàng quản lý sự phức tạp của ứng dụng bằng cách chia ứng dụng thành ba thành phần model, view, controller

  • Nó không sử dụng view state hoặc server-based form. Điều này tốt cho những lập trình viên muốn quản lý hết các khía cạnh của một ứng dụng.

  • Nó sử dụng mẫu Front Controller, mẫu này giúp quản lý các requests (yêu cầu) chỉ thông qua một Controller. Nhờ đó bạn có thể thiết kế một hạ tầng quản lý định tuyến. Để có nhiều thông tin hơn, bạn nên xem phần Front Controller trên web site MSDN

  • Hỗ trợ tốt hơn cho mô hình phát triển ứng dụng hướng kiểm thử (TDD)

  • Nó hỗ trợ tốt cho các ứng dụng được xây dựng bởi những đội có nhiều lập trình viên và thiết kế mà vẫn quản lý được tính năng của ứng dụng

Lợi ích của ứng dụng được xây dựng trên nền tảng Web Forms

  • Nó hỗ trợ cách lập trình hướng sự kiện, quản lý trạng thái trên giao thức HTTP, tiện dụng cho việc phát triển các ứng dụng Web phục vụ kinh doanh. Các ứng dụng trên nền tảng Web Forms cung cấp hàng tá các sự kiện được hỗ trợ bởi hàng trăm các server controls.

  • Sử dụng mẫu Page Controller. Xem thêm ở mục Page Controller trên MSDN

  • Mô hình này sử dụng view state hoặc server-based form, nhờ đó sẽ giúp cho việc quản lý trạng thái các trang web dễ dàng.

  • Nó rất phù hợp với các nhóm lập trình viên quy mô nhỏ và các thiết kế, những người muốn tận dụng các thành phần giúp xây dựng ứng dụng một cách nhanh chóng.

  • Nói tóm lại, áp dụng Web Forms giúp giảm bớt sự phức tạp trong xây dựng ứng dụng, bởi vì các thành phần (lớp Page, controls,…) được tích hợp chặc chẽ và thường thì giúp bạn viết ít code hơn là áp dụng theo mô hình MVC.

Các tính năng của nền tảng ASP.NET MVC

  • Tách bạch các tác vụ của ứng dụng (logic nhập liệu, business logic, và logic giao diện), dễ dàng kiểm thử và mặc định áp dụng hướng phát triển TDD. Tất cả các tính năng chính của mô hình MVC được cài đặt dựa trên interface và được kiểm thử bằng cách sử dụng các đối tượng mocks, mock object là các đối tượng mô phỏng các tính năng của những đối tượng thực sự trong ứng dụng. Bạn có thể kiểm thử unit-test cho ứng dụng mà không cần chạy controller trong tiến trình ASP.NET, và điều đó giúp unit test được áp dụng nhanh chóng và tiện dụng. Bạn có thể sử dụng bất kỳ nền tảng unit-testing nào tương thích với nền tảng .NET.

  • MVC là một nền tảng khả mở rộng (extensible) & khả nhúng (pluggable). Các thành phần của ASP.NET MVC được thiết kể để chúng có thể được thay thế một cách dễ dàng hoặc dễ dàng tùy chỉnh. Bạn có thể nhúng thêm view engine, cơ chế định tuyến cho URL, cách kết xuất tham số của action-method và các thành phần khác. ASP.NET MVC cũng hỗ trợ việc sử dụng Dependency Injection (DI) và Inversion of Control (IoC). DI cho phép bạn gắn các đối tượng vào một lớp cho lớp đó sử dụng thay vì buộc lớp đó phải tự mình khởi tạo các đối tượng. IoC quy định rằng, nếu một đối tượng yêu cầu một đối tượng khác, đối tượng đầu sẽ lấy đối tượng thứ hai từ một nguồn bên ngoài, ví dụ như từ tập tin cấu hình. Và nhờ vậy, việc sử dụng DI và IoC sẽ giúp kiểm thử dễ dàng hơn.

  • ASP.NET MVC có thành phần ánh xạ URL mạnh mẽ cho phép bạn xây dựng những ứng dụng có các địa chỉ URL xúc tích và dễ tìm kiếm. Các địa chỉ URL không cần phải có phần mở rộng của tên tập tin và được thiết kế để hỗ trợ các mẫu định dạng tên phù hợp với việc tối ưu hóa tìm kiếm (URL) và phù hợp với lập địa chỉ theo kiểu REST.

  • Hỗ trợ sử dụng đặc tả (các thẻ) của các trang ASP.NET(.aspx), điều khiển người dùng (.ascx) và trang master page (.marter). Bạn có thể sử dụng các tính năng có sẵn của ASP.NET như là sử dụng lồng các trang master page, sử dụng in-line expression (<%= %>), sử dụng server controls, mẫu, data-binding, địa phương hóa (localization) và hơn thế nữa.

  • Hỗ trợ các tính năng có sẵn của ASP.NET như cơ chế xác thực người dùng, quản lý thành viên, quyền, output caching và data caching, seession và profile, quản lý tình trạng ứng dụng, hệ thống cấu hình…

  • ASP.NET MVC 3 còn bổ sung một view engine mới là Razor View Engine cho phép thiết lập các view nhanh chóng, dễ dàng và tốn ít công sức hơn so với việc sử dụng Web Forms view engine.

Tuyên bố Không chịu trách nhiệm Nội dung Giải pháp Cộng đồng

CÔNG TY MICROSOFT VÀ/HOẶC CÁC NHÀ CUNG CẤP CỦA HỌ KHÔNG BẢO ĐẢM VỀ TÍNH PHÙ HỢP, ĐỘ TIN CẬY HOẶC TÍNH CHÍNH XÁC CỦA THÔNG TIN VÀ HÌNH ẢNH LIÊN QUAN Ở ĐÂY. MỌI THÔNG TIN VÀ HÌNH ẢNH NHƯ VẬY ĐƯỢC CUNG CẤP “NHƯ NGUYÊN MẪU” MÀ KHÔNG CÓ BẤT KỲ BẢO ĐẢM NÀO. MICROSOFT VÀ/HOẶC CÁC NHÀ CUNG CẤP CỦA HỌ KHÔNG CHỊU TRÁCH NHIỆM ĐỐI VỚI MỌI BẢO ĐẢM VÀ ĐIỀU KIỆN VỀ THÔNG TIN VÀ HÌNH ẢNH LIÊN QUAN NÀY, BAO GỒM CẢ MỌI BẢO ĐẢM VÀ ĐIỀU KIỆN LIÊN QUAN VỀ TÍNH THƯƠNG MẠI, PHÙ HỢP CHO MỘT MỤC ĐÍCH ĐẶC BIỆT, NỖ LỰC CỦA CÔNG VIỆC, TƯ CÁCH VÀ CAM KẾT KHÔNG VI PHẠM. BẠN ĐỒNG Ý MỘT CÁCH CỤ THỂ LÀ KHÔNG CÓ TRƯỜNG HỢP NÀO MÀ MICROSOFT VÀ/HOẶC CÁC NHÀ CUNG CẤP CỦA HỌ BỊ RÀNG BUỘC VÀO BẤT KỲ THIỆT HẠI TRỰC TIẾP, GIÁN TIẾP, TRỪNG PHẠT, TÌNH CỜ, ĐẶC BIỆT, HỆ QUẢ HOẶC BẤT KỲ THIỆT HẠI DẠNG NÀO, BAO GỒM NHƯNG KHÔNG GIỚI HẠN THIỆT HẠI DO MẤT MÁT, DỮ LIỆU HOẶC LỢI ÍCH, XẢY RA HOẶC TRONG MỌI CÁCH LIÊN QUAN ĐẾN VIỆC SỬ DỤNG HOẶC KHÔNG THỂ SỬ DỤNG THÔNG TIN VÀ HÌNH ẢNH LIÊN QUAN CÓ Ở ĐÂY, DÙ LÀ DỰA VÀO HỢP ĐỒNG, LỖI GÂY THIỆT HẠI, SƠ SUẤT, NGHĨA VỤ PHÁP LÝ HOẶC BẤT KỲ CƠ SỞ NÀO KHÁC, NGAY CẢ NẾU MICROSOFT HOẶC BẤT KỲ NHÀ CUNG CẤP NÀO CỦA HỌ ĐÃ ĐƯỢC TƯ VẤN VỀ KHẢ NĂNG BỊ THIỆT HẠI.

ASP.NET

Phát triển bởi Microsoft
Phiên bản ổn định

4.5

Kho mã nguồn
Viết bằng .NET Languages
Thể loại Web application framework
Giấy phép Proprietary
Website www.asp.net

ASP.NET là một nền tảng ứng dụng web (web application framework) được phát triển và cung cấp bởi Microsoft, cho phép những người lập trình tạo ra những trang web động, những ứng dụng web và những dịch vụ web. Lần đầu tiên được đưa ra thị trường vào tháng 1 năm 2002 cùng với phiên bản 1.0 của.NET framework, là công nghệ nối tiếp của Microsoft’s Active Server Pages(ASP). ASP.NET được biên dịch dưới dạng Common Language Runtime (CLR), cho phép những người lập trình viết mã ASP.NET với bất kỳ ngôn ngữ nào được hỗ trợ bởi.NET language.

Trả về file

FileResult là một Action result sử dụng bởi Controller action để trả về file cho người dùng.

FileResult

FileResult là một base class sử dụng để gửi file nhị phân về response. Nó là một abstract class được triển khai bởi FileContentResult, FileStreamResult, VirtualFileResult, và PhysicalFileResult. Các class này đảm nhiệm công việc gửi file về client.

FileContentResult

FileContentResult đọc một mảng byte và trả về như một file:


return new FileContentResult(byteArray, "application/pdf")

FileStreamResult

FileStreamResult đọc một luồng stream và trả về một file:


return new FileStreamResult(fileStream, "application/pdf");

VirtualFileResult

Action result này đọc nội dung của một file từ một đường dẫ ntuowng đối của ứng dụng trên hosting và gửi nội dung về client dưới dạng 1 file:


return new VirtualFileResult("/path/filename", "application/pdf");

PhysicalFileResult

Action result này đọc nội dung của một file từ một vị trí vật lý và gửi nội dung về client như một file. Chú ý là đường dẫ phải là đường dẫn tuyệt đối:


return new PhysicalFileResult("c:/path/filename", "application/pdf");

Lịch sử[sửa | sửa mã nguồn]

Sau khi phát hành phiên bản Internet Information Service 4.0 vào năm 1997, hãng Microsoft bắt đầu nghiên cứu một mô hình ứng dụng web để giải quyết những bất tiện của ASP, đặc biệt là việc tách riêng biệt phần thể hiện và phần nội dung cũng như cách viết mã rõ ràng hơn. Mark Anders, quản lý của nhóm IIS và Scott Guthrie, gia nhập Microsoft vào năm 1997 sau khi tốt nghiệp Đại học Duke, được giao nhiệm vụ định hình mô hình cần phát triển. Những thiết kế ban đầu được thực hiện trong vòng 2 tháng bởi Anders và Guthrie, Guthrie đã viết mã prototype đầu tiên trong khoảng thời gian nghỉ lễ Giáng sinh năm 1997.

Feedback

Submit and view feedback for

Khóa học lập trình ASP.NET Core từ căn bản đến nâng cao là món quà của TEDU gửi tới tất cả các bạn thành viên của TEDU. Đây là khóa học giúp các bạn mới bắt đầu với .NET Core nói chung và ASP.NET Core nói riêng có một nền tảng tốt để học lập trình ASP.NET Core sau này. Khóa học này sẽ hoàn toàn miễn phí cho tất cả mọi người và phát hành chính thức tại TEDU.COM.VN. Khóa học này sẽ bao gồm cả series bài viết tại https://tedu.com.vn/series/hoc-aspnet-core-can-ban.html và video trên phần khóa học.

Khóa học này gồm 2 nội dung chính là phần 1 sẽ bao gồm các kiến thức căn bản về ASP.NET MVC Core cũng như là mô hình MVC và các tính năng mới trong ASP.NET Core.

Phần hai sẽ là phần xây dựng một dự án thật từ đầu đến cuối sử dụng ASP.NET Core.

Đầu vào các bạn sẽ cần có kiến thức C# căn bản, HTML CSS và Javascript.

Nếu có kiến thức ASP.NET rồi thì tốt còn không thì cũng không sao.

Sau khóa học các bạn có thể tự làm một website hoàn chỉnh và có thể hiểu chắc chắn các kiến thức về mô hình MVC cũng như các khái niệm trong lập trình web nói chung và lập trình ASP.NET MVC nói riêng. Trong quá trình học nếu có gì khó khăn các bạn có thể thảo luận ngay tại video phần bình luận.

Họ và tên: Toàn Bạch

Nghề nghiêp: Senior Fullstack .NET Developer

Kỹ năng: Có hơn 8 năm làm dự án về ASP.NET MVC, WebForm, Web Service, Web API, ASP.NET Core, Angular SQL Server, JQuery, SOLID, Design Pattern, DevOps.

ASP.NET Core MVC with EF Core – tutorial series

This tutorial has not been updated to ASP.NET Core 3.0. It has been updated for ASP.NET Core 5.0.

This tutorial teaches ASP.NET Core MVC and Entity Framework Core with controllers and views. Razor Pages is an alternative programming model. For new development, we recommend Razor Pages over MVC with controllers and views. See the Razor Pages version of this tutorial. Each tutorial covers some material the other doesn’t:

Some things this MVC tutorial has that the Razor Pages tutorial doesn’t:

  • Implement inheritance in the data model
  • Perform raw SQL queries
  • Use dynamic LINQ to simplify code

Some things the Razor Pages tutorial has that this one doesn’t:

  • Use Select method to load related data
  • Best practices for EF.

Cộng tác với chúng tôi trên GitHub

Bạn có thể tìm thấy nguồn cho nội dung này trên GitHub, nơi bạn cũng có thể tạo và xem lại các vấn đề và yêu cầu kéo. Để biết thêm thông tin, hãy xem hướng dẫn dành cho người đóng góp của chúng tôi.

Seed the database

Create a new class named

SeedData

in the Models folder. Replace the generated code with the following:


using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using MvcMovie.Data; using System; using System.Linq; namespace MvcMovie.Models; public static class SeedData { public static void Initialize(IServiceProvider serviceProvider) { using (var context = new MvcMovieContext( serviceProvider.GetRequiredService< DbContextOptions

>())) { // Look for any movies. if (context.Movie.Any()) { return; // DB has been seeded } context.Movie.AddRange( new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-2-12"), Genre = "Romantic Comedy", Price = 7.99M }, new Movie { Title = "Ghostbusters ", ReleaseDate = DateTime.Parse("1984-3-13"), Genre = "Comedy", Price = 8.99M }, new Movie { Title = "Ghostbusters 2", ReleaseDate = DateTime.Parse("1986-2-23"), Genre = "Comedy", Price = 9.99M }, new Movie { Title = "Rio Bravo", ReleaseDate = DateTime.Parse("1959-4-15"), Genre = "Western", Price = 3.99M } ); context.SaveChanges(); } } }

If there are any movies in the database, the seed initializer returns and no movies are added.


if (context.Movie.Any()) { return; // DB has been seeded. }

Add the seed initializer

Replace the contents of

Program.cs

with the following code. The new code is highlighted.


using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using MvcMovie.Data; using MvcMovie.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext

(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext"))); // Add services to the container. builder.Services.AddControllersWithViews(); var app = builder.Build(); using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; SeedData.Initialize(services); } // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();

Delete all the records in the database. You can do this with the delete links in the browser or from SSOX.

Test the app. Force the app to initialize, calling the code in the

Program.cs

file, so the seed method runs. To force initialization, close the command prompt window that Visual Studio opened, and restart by pressing Ctrl+F5.

The app shows the seeded data.

The

MvcMovieContext

object handles the task of connecting to the database and mapping

Movie

objects to database records. The database context is registered with the Dependency Injection container in the

Program.cs

file:


var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext

(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

The ASP.NET Core Configuration system reads the

ConnectionString

key. For local development, it gets the connection string from the

appsettings.json

file:


"ConnectionStrings": { "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true" }

When the app is deployed to a test or production server, an environment variable can be used to set the connection string to a production SQL Server. For more information, see Configuration.

Seed the database

Create a new class named

SeedData

in the Models folder. Replace the generated code with the following:


using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using MvcMovie.Data; using System; using System.Linq; namespace MvcMovie.Models { public static class SeedData { public static void Initialize(IServiceProvider serviceProvider) { using (var context = new MvcMovieContext( serviceProvider.GetRequiredService< DbContextOptions

>())) { // Look for any movies. if (context.Movie.Any()) { return; // DB has been seeded } context.Movie.AddRange( new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-2-12"), Genre = "Romantic Comedy", Price = 7.99M }, new Movie { Title = "Ghostbusters ", ReleaseDate = DateTime.Parse("1984-3-13"), Genre = "Comedy", Price = 8.99M }, new Movie { Title = "Ghostbusters 2", ReleaseDate = DateTime.Parse("1986-2-23"), Genre = "Comedy", Price = 9.99M }, new Movie { Title = "Rio Bravo", ReleaseDate = DateTime.Parse("1959-4-15"), Genre = "Western", Price = 3.99M } ); context.SaveChanges(); } } } }

If there are any movies in the database, the seed initializer returns and no movies are added.


if (context.Movie.Any()) { return; // DB has been seeded. }

Add the seed initializer

Replace the contents of

Program.cs

with the following code:


using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using MvcMovie.Data; using MvcMovie.Models; using System; namespace MvcMovie { public class Program { public static void Main(string[] args) { var host = CreateHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { SeedData.Initialize(services); } catch (Exception ex) { var logger = services.GetRequiredService
>(); logger.LogError(ex, "An error occurred seeding the DB."); } } host.Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup

(); }); } }

Test the app.

Delete all the records in the database. You can do this with the delete links in the browser or from SSOX.

Force the app to initialize, calling the methods in the

Startup

class, so the seed method runs. To force initialization, IIS Express must be stopped and restarted. You can do this with any of the following approaches:

  • Right-click the IIS Express system tray icon in the notification area and tap Exit or Stop Site:

    • If you were running VS in non-debug mode, press F5 to run in debug mode
    • If you were running VS in debug mode, stop the debugger and press F5

The app shows the seeded data.

SQL Server Express LocalDB

LocalDB:

  • Is a lightweight version of the SQL Server Express Database Engine, installed by default with Visual Studio.
  • Starts on demand by using a connection string.
  • Is targeted for program development. It runs in user mode, so there’s no complex configuration.
  • By default creates .mdf files in the C:/Users/{user} directory.

MVC pattern

The Model-View-Controller (MVC) architectural pattern separates an application into three main groups of components: Models, Views, and Controllers. This pattern helps to achieve separation of concerns. Using this pattern, user requests are routed to a Controller which is responsible for working with the Model to perform user actions and/or retrieve results of queries. The Controller chooses the View to display to the user, and provides it with any Model data it requires.

The following diagram shows the three main components and which ones reference the others:

This delineation of responsibilities helps you scale the application in terms of complexity because it’s easier to code, debug, and test something (model, view, or controller) that has a single job. It’s more difficult to update, test, and debug code that has dependencies spread across two or more of these three areas. For example, user interface logic tends to change more frequently than business logic. If presentation code and business logic are combined in a single object, an object containing business logic must be modified every time the user interface is changed. This often introduces errors and requires the retesting of business logic after every minimal user interface change.

Note

Both the view and the controller depend on the model. However, the model depends on neither the view nor the controller. This is one of the key benefits of the separation. This separation allows the model to be built and tested independent of the visual presentation.

Model Responsibilities

The Model in an MVC application represents the state of the application and any business logic or operations that should be performed by it. Business logic should be encapsulated in the model, along with any implementation logic for persisting the state of the application. Strongly-typed views typically use ViewModel types designed to contain the data to display on that view. The controller creates and populates these ViewModel instances from the model.

View Responsibilities

Views are responsible for presenting content through the user interface. They use the Razor view engine to embed .NET code in HTML markup. There should be minimal logic within views, and any logic in them should relate to presenting content. If you find the need to perform a great deal of logic in view files in order to display data from a complex model, consider using a View Component, ViewModel, or view template to simplify the view.

Controller Responsibilities

Controllers are the components that handle user interaction, work with the model, and ultimately select a view to render. In an MVC application, the view only displays information; the controller handles and responds to user input and interaction. In the MVC pattern, the controller is the initial entry point, and is responsible for selecting which model types to work with and which view to render (hence its name – it controls how the app responds to a given request).

Note

Controllers shouldn’t be overly complicated by too many responsibilities. To keep controller logic from becoming overly complex, push business logic out of the controller and into the domain model.

Tip

If you find that your controller actions frequently perform the same kinds of actions, move these common actions into filters.

Keywords searched by users: asp net core mvc

Get Started With Asp.Net Core Mvc | Microsoft Learn
Get Started With Asp.Net Core Mvc | Microsoft Learn
Introduction To Asp.Net Core Mvc (.Net 8) - Youtube
Introduction To Asp.Net Core Mvc (.Net 8) – Youtube
Asp.Net Core Mvc: Tutorial | Simplilearn
Asp.Net Core Mvc: Tutorial | Simplilearn
Learn Asp.Net Core Mvc (.Net 6) - Full Course - Youtube
Learn Asp.Net Core Mvc (.Net 6) – Full Course – Youtube
Dự Án Asp.Net Core Mvc | Tự Học Ict
Dự Án Asp.Net Core Mvc | Tự Học Ict
Asp.Net Core Mvc Request Life Cycle
Asp.Net Core Mvc Request Life Cycle
Asp.Net Core] Phần 1: Giới Thiệu Về Asp.Net Core | Dammio
Asp.Net Core] Phần 1: Giới Thiệu Về Asp.Net Core | Dammio
View Trong Asp.Net Core Mvc, Layout, Viewstart, Viewimports | Tự Học Ict
View Trong Asp.Net Core Mvc, Layout, Viewstart, Viewimports | Tự Học Ict
Asp.Net Core Mvc Project Structure
Asp.Net Core Mvc Project Structure
Get Started With Asp.Net Core Mvc | Microsoft Learn
Get Started With Asp.Net Core Mvc | Microsoft Learn
Models In Asp.Net Core Mvc Application - Dot Net Tutorials
Models In Asp.Net Core Mvc Application – Dot Net Tutorials
Smartpro Triển Khai Chương Trình Đào Tạo Lập Trình Asp.Net Core Mvc Nâng  Cao | Smartpro.Vn
Smartpro Triển Khai Chương Trình Đào Tạo Lập Trình Asp.Net Core Mvc Nâng Cao | Smartpro.Vn
Nhập Môn Asp.Net Core Mvc – Trần Ngọc Minh Notes
Nhập Môn Asp.Net Core Mvc – Trần Ngọc Minh Notes
Asp.Net Core Mvc & Identity Ui - User Registration And Login - Youtube
Asp.Net Core Mvc & Identity Ui – User Registration And Login – Youtube
Mvc Design Pattern Trong Asp.Net Core
Mvc Design Pattern Trong Asp.Net Core
Sự Khác Biệt Giữa Asp.Net Với Asp.Net Core?Có Nên Học Lập Trình Web Với Asp.Net  Core Không?
Sự Khác Biệt Giữa Asp.Net Với Asp.Net Core?Có Nên Học Lập Trình Web Với Asp.Net Core Không?

See more here: kientrucannam.vn

Leave a Reply

Your email address will not be published. Required fields are marked *