Chủ đề của Advanced Cross-Platform Application Programming With .NET - Lập trình ứng dụng đa nền tảng nâng cao với .NET

PRN222 - Chương 4: ASP.NET Core MVC

ASP.NET Core MVC trong PRN222: controller, action, IActionResult, ViewResult, PartialView và attribute HttpPost. Nội dung chương còn gồm directive @model cho strongly-typed view, cú pháp Razor, ViewData và ViewBag dùng chung một kho dữ liệu, bẫy ép kiểu InvalidCastException, model binding, model validation với ModelState.IsValid, attribute Bind và Compare, thư mục wwwroot chứa file tĩnh. Học xong chương này, người học dựng được một luồng MVC trọn vẹn từ controller tới view có kiểm tra dữ liệu.

Xem danh sách câu hỏi20 câu hỏi100% có giải thích

Bắt đầu bằng Chế độ học nếu bạn muốn đáp án và giải thích hiện ngay sau mỗi câu — không bấm giờ, dừng lúc nào cũng được. Chọn Thi thử khi muốn biết mình đang ở đâu: có bấm giờ, chấm điểm ở cuối, và giải thích chỉ mở sau khi nộp.

Học ngân hàng câu hỏi của chủ đề

Luyện tập theo chủ đề này

20Câu hỏi hiện có

Câu hỏi của chủ đề

20/20 câuHết danh sách
AThe same instance
BDifferent instances
CNull references
DRuntime error
Lời giải
Khi sử dụng AddTransient<EmailService, EmailService>(), mỗi lần inject vào controller sẽ tạo ra một instance mới của EmailService. Điều này có nghĩa là mỗi lần inject sẽ có một instance khác nhau. VìTransient là một loại lifestyle trong Dependency Injection, nó sẽ tạo ra một instance mới mỗi lần inject, không lưu trữ instance trước đó. Vì vậy, nếu inject vào controller hai lần, sẽ có hai instance khác nhau của EmailService.
Mở trang câu hỏi này →
2Consider this C# code:4 lựa chọncó codeTrung bình67% trả lời đúng
Đề bài
public IActionResult Save(Person person) {
  if (ModelState.IsValid) return Content("Valid");
  return Content("Error");
}

If no value for Age is passed and Age is int, what happens?

AValid
BError
CException
DNull
Lời giải
Nếu không có giá trị cho thuộc tính Age và Age được định nghĩa là kiểu int, thì khi thực hiện phương thức Save, chương trình sẽ không ném ra ngoại lệ. Thay vào đó, nó sẽ kiểm tra trạng thái hợp lệ của mô hình (ModelState.IsValid). Vì Age không được cung cấp, nên mô hình sẽ không hợp lệ. Do đó, phương thức sẽ trả về nội dung "Error".
Mở trang câu hỏi này →
3Consider this C# code:4 lựa chọncó codeDễ80% trả lời đúng
Đề bài
public class Person {
  public int Age { get; set; }
}
public IActionResult Save(Person person) {
  if (!ModelState.IsValid) {
    return Content("Invalid!");
  }
  return Content("OK");
}

Input: Age = "abc"? What is the output?

AOK
BInvalid!
CException
DNull
Lời giải
Khi thực hiện việc lưu trữ thông tin người dùng với lớp Person, chúng ta cần kiểm tra xem dữ liệu đầu vào có hợp lệ hay không. Trong trường hợp này, lớp Person chỉ có một thuộc tính là Age, và dữ liệu đầu vào là một chuỗi 'abc'. Vì Age được định nghĩa là một số nguyên (int), nên khi chúng ta cố gắng lưu trữ chuỗi 'abc' vào thuộc tính Age, hệ thống sẽ phát hiện ra lỗi và trả về thông điệp 'Invalid!' để thông báo cho người dùng.
Mở trang câu hỏi này →
4Consider this C# code:4 lựa chọncó codeDễ75% trả lời đúng
Đề bài
public IActionResult Index() {
  ViewData["User"] = "Admin";
  return View();
}

Razor: <p>@ViewBag.User</p> What is displayed?

AAdmin
Bnull
CError
DNothing
Lời giải
Khi chạy mã C# trên, chúng ta sẽ thấy kết quả là "Admin". Lý do là vì trong phương thức Index(), chúng ta đã gán giá trị "Admin" vào ViewData với khóa "User". Sau đó, trong Razor, chúng ta sử dụng ViewBag.User để hiển thị giá trị này. Vì vậy, kết quả cuối cùng sẽ là "Admin".
Mở trang câu hỏi này →
5What does the IActionResult interface represent?4 lựa chọnDễ100% trả lời đúng
AA database connection.
BThe result of an action method.
CA user session.
DA network request.
Lời giải
IActionResult là một giao diện trong ASP.NET Core, đại diện cho kết quả của một phương thức hành động. Nó cho phép bạn trả về nhiều loại kết quả khác nhau, chẳng hạn như một trang web, một chuyển hướng, một trạng thái HTTP, v.v. Khi một phương thức hành động được gọi, nó sẽ trả về một đối tượng thực thi IActionResult, đại diện cho kết quả của phương thức đó. Điều này cho phép bạn xử lý kết quả một cách linh hoạt và dễ dàng trong ứng dụng của mình.
Mở trang câu hỏi này →
6What is "Model Validation" in ASP.NET Core MVC?4 lựa chọnDễ100% trả lời đúng
AThe process of encrypting data.
BThe process of ensuring that user input meets specific criteria.
CThe process of managing database connections.
DThe process of routing HTTP requests.
Lời giải
Trong ASP.NET Core MVC, "Model Validation" là quá trình đảm bảo rằng dữ liệu được nhập vào bởi người dùng đáp ứng các tiêu chí cụ thể. Quá trình này giúp ngăn chặn các dữ liệu không hợp lệ được lưu trữ vào cơ sở dữ liệu hoặc sử dụng trong ứng dụng. Model Validation thường được thực hiện bằng cách sử dụng các thuộc tính và phương thức đặc biệt trên mô hình dữ liệu (model) để xác minh tính hợp lệ của dữ liệu. Ví dụ, bạn có thể sử dụng thuộc tính `[Required]` để yêu cầu một trường dữ liệu không được bỏ trống, hoặc thuộc tính `[Range]` để xác định phạm vi giá trị cho một trường dữ liệu. Quá trình này giúp đảm bảo rằng dữ liệu được nhập vào là chính xác và đáng tin cậy, từ đó giúp ứng dụng hoạt động ổn định và hiệu quả.
Mở trang câu hỏi này →
7What is the purpose of the ViewBag or ViewData in ASP.NET Core MVC?4 lựa chọnDễ100% trả lời đúng
ATo manage database connections.
BTo pass data from a controller to a view.
CTo encrypt data.
DTo manage user sessions.
Lời giải
Trong ASP.NET Core MVC, ViewBag và ViewData là hai đối tượng được sử dụng để truyền dữ liệu từ controller sang view. Chúng giúp bạn có thể dễ dàng chia sẻ dữ liệu giữa các lớp controller và view mà không cần phải sử dụng đến các phương thức phức tạp. ViewBag và ViewData đều là các đối tượng động, có thể được sử dụng để truyền dữ liệu của bất kỳ loại nào, bao gồm cả các đối tượng phức tạp như danh sách hoặc các đối tượng có liên quan. Việc sử dụng ViewBag và ViewData giúp bạn có thể dễ dàng quản lý dữ liệu và giảm thiểu sự phức tạp trong việc chia sẻ dữ liệu giữa các lớp.
Mở trang câu hỏi này →
8Consider this C# code:4 lựa chọncó codeDễ89% trả lời đúng
Đề bài
public IActionResult Index() {
  ViewBag.Count = 10;
  return View();
}

Razor: <p>@(ViewBag.Count + 5)</p> What happens?

A15
B105
CError
DNothing
Lời giải
Khi chạy mã C# trên, chúng ta sẽ thấy kết quả là 15. Lý do là vì trong phương thức Index(), chúng ta đã gán giá trị 10 vào biến ViewBag.Count. Sau đó, trong Razor, chúng ta sử dụng biểu thức @ để truy cập vào giá trị của ViewBag.Count và thực hiện phép tính cộng với 5. Kết quả của phép tính này sẽ được hiển thị trên màn hình. Điều này cho thấy rằng ViewBag là một cách để truyền dữ liệu từ controller sang view trong ứng dụng ASP.NET.
Mở trang câu hỏi này →
9What is the purpose of the [HttpPost] attribute in ASP.NET Core MVC?4 lựa chọnDễ100% trả lời đúng
ATo specify a database connection.
BTo specify that an action method handles HTTP POST requests.
CTo encrypt data.
DTo manage user sessions.
Lời giải
Trong ASP.NET Core MVC, [HttpPost] là một thuộc tính được sử dụng để chỉ định phương thức hành động (action method) sẽ xử lý yêu cầu HTTP POST. Khi một yêu cầu HTTP POST được gửi đến ứng dụng, [HttpPost] sẽ giúp xác định phương thức hành động nào sẽ được thực hiện để xử lý yêu cầu này. Điều này cho phép nhà phát triển có thể kiểm soát và quản lý các yêu cầu HTTP POST một cách hiệu quả. Ngoài ra, [HttpPost] cũng giúp ngăn chặn các yêu cầu HTTP POST không mong muốn từ được xử lý bởi các phương thức hành động khác. Vì vậy, [HttpPost] là một công cụ quan trọng trong việc xây dựng các ứng dụng web dựa trên ASP.NET Core MVC.
Mở trang câu hỏi này →
10What is the purpose of the PartialView in ASP.NET Core MVC?4 lựa chọnDễ100% trả lời đúng
ATo return a complete HTML page.
BTo return a reusable portion of a view.
CTo return a JSON response.
DTo redirect to another action.
Lời giải
Trong ASP.NET Core MVC, PartialView được sử dụng để trả về một phần tái sử dụng của một view. Điều này có nghĩa là PartialView sẽ trả về một phần của HTML mà bạn có thể tái sử dụng trong nhiều trang khác nhau. Ví dụ, bạn có thể sử dụng PartialView để tạo ra một menu hoặc một phần header mà có thể được sử dụng trên nhiều trang khác nhau. PartialView được sử dụng khi bạn muốn tái sử dụng một phần của view mà không cần phải tạo ra một view hoàn chỉnh. Điều này giúp giảm thiểu mã nguồn và tăng cường khả năng tái sử dụng.
Mở trang câu hỏi này →
11Which of the following is true about the scope of ViewBag and ViewData?4 lựa chọnDễ100% trả lời đúng
AThey are available across multiple requests.
BThey are only available within the current view.
CThey are available between the controller action and the corresponding view.
DThey are available across all controllers and views.
Lời giải
ViewBag và ViewData là hai đối tượng được sử dụng để truyền dữ liệu từ controller sang view trong ASP.NET. Chúng được sử dụng để lưu trữ dữ liệu tạm thời trong quá trình xử lý yêu cầu. Câu hỏi này hỏi về phạm vi của hai đối tượng này. Chọn đáp án đúng: Chúng có sẵn giữa hành động controller và view tương ứng. ViewBag và ViewData đều là các đối tượng được sử dụng để truyền dữ liệu từ controller sang view. Chúng được sử dụng để lưu trữ dữ liệu tạm thời trong quá trình xử lý yêu cầu. Chúng không được lưu trữ trong session hoặc database, mà chỉ được lưu trữ trong quá trình xử lý yêu cầu. Vì vậy, chúng không có sẵn giữa các yêu cầu khác nhau. Chúng cũng không có sẵn giữa các controller và view khác nhau. Chúng chỉ có sẵn giữa hành động controller và view tương ứng. Điều này có nghĩa là dữ liệu được lưu trữ trong ViewBag và ViewData sẽ bị xóa sau khi view được tải lên và không thể truy cập được trong các yêu cầu khác nhau.
Mở trang câu hỏi này →
12Consider this C# code:4 lựa chọncó codeDễ89% trả lời đúng
Đề bài
services.AddScoped<IRepository, CustomerRepository>();

In an ASP.NET Core web app, how often is CustomerRepository created?

AOnce per application
BOnce per request
COnce per controller
DEvery time it's injected
Lời giải
Trong ASP.NET Core, khi bạn sử dụng phương thức AddScoped trong dịch vụ Dependency Injection, thì đối tượng được tạo ra sẽ được lưu giữ trong suốt vòng đời của yêu cầu HTTP. Điều này có nghĩa là đối tượng sẽ được tạo ra một lần khi ứng dụng nhận được yêu cầu HTTP đầu tiên và sẽ được sử dụng cho đến khi yêu cầu HTTP đó được hoàn tất. Sau đó, đối tượng sẽ được hủy bỏ và tái tạo lại khi ứng dụng nhận được yêu cầu HTTP tiếp theo. Vì vậy, trong trường hợp của bạn, đối tượng CustomerRepository sẽ được tạo ra một lần khi ứng dụng nhận được yêu cầu HTTP đầu tiên và sẽ được sử dụng cho đến khi yêu cầu HTTP đó được hoàn tất.
Mở trang câu hỏi này →
13Consider this C# code:4 lựa chọncó codeDễ78% trả lời đúng
Đề bài
public IActionResult Index() {
  ViewData["Count"] = "10";
  return View();
}

In Razor: <p>@((int)ViewData["Count"] + 5)</p> What happens?

ADisplays 15
BDisplays 105
CInvalidCastException
DNothing
Lời giải
Khi chạy đoạn mã trên, chúng ta sẽ gặp một lỗi. Lỗi này xảy ra vì trong đoạn mã C#, chúng ta đã gán giá trị "10" vào ViewData với key là "Count". Tuy nhiên, trong Razor, chúng ta đã cố gắng ép giá trị này thành một số nguyên (int) để thực hiện phép tính cộng. Nhưng "10" không phải là một số nguyên, mà là một chuỗi. Do đó, khi chúng ta cố gắng ép nó thành int, sẽ xảy ra lỗi InvalidCastException.
Mở trang câu hỏi này →
A[Compare]
B[Required]
C[StringLength]
D[Range]
Lời giải
Để xác minh hai thuộc tính trong một mô hình khớp nhau, bạn cần sử dụng thuộc tính [Compare]. Ví dụ, khi bạn muốn đảm bảo rằng mật khẩu và xác nhận mật khẩu phải trùng nhau, bạn có thể sử dụng [Compare] để thực hiện việc này. Ngoài ra, [Compare] cũng có thể được sử dụng để xác minh các thuộc tính khác như email hoặc số điện thoại.
Mở trang câu hỏi này →
A"Views"
B"Models"
C"Controllers"
D"wwwroot"
Lời giải
Trong một dự án ASP.NET Core MVC, thư mục thường chứa các tệp tin tĩnh (CSS, JavaScript, hình ảnh) là "wwwroot". Thư mục này được sử dụng để lưu trữ các tệp tin tĩnh mà không cần phải biên dịch lại khi chạy ứng dụng. Điều này giúp tăng tốc độ tải trang và giảm thiểu thời gian chờ đợi. Ngoài ra, thư mục "wwwroot" cũng có thể chứa các tệp tin khác như hình ảnh, video, âm thanh, v.v. Nó là một phần quan trọng của cấu trúc dự án ASP.NET Core MVC và giúp tạo điều kiện thuận lợi cho việc phát triển và triển khai ứng dụng.
Mở trang câu hỏi này →
16What is the purpose of the @ symbol in Razor syntax?4 lựa chọnDễ100% trả lời đúng
ATo define a CSS rule.
BTo indicate a JavaScript block.
CTo switch between HTML and C# code.
DTo define a database query.
Lời giải
Trong Razor syntax, @ được sử dụng để chỉ định chuyển đổi giữa mã HTML và mã C# code. Khi bạn sử dụng @ trước một đoạn mã C#, nó sẽ được biên dịch thành mã HTML có thể được trình duyệt hiểu. Điều này cho phép bạn dễ dàng kết hợp mã C# và mã HTML trong một file Razor. Ví dụ, bạn có thể sử dụng @ để hiển thị giá trị của một biến C# trong một thẻ HTML. Ngoài ra, @ còn được sử dụng để gọi các phương thức của một đối tượng C# và hiển thị kết quả trong một thẻ HTML. Tóm lại, @ là một ký tự quan trọng trong Razor syntax, giúp bạn dễ dàng kết hợp mã C# và mã HTML trong một file.
Mở trang câu hỏi này →
17What is the purpose of the [Bind] attribute in ASP.NET Core MVC?4 lựa chọnDễ100% trả lời đúng
ATo specify which properties of a model should be bound from the request.
BTo encrypt data.
CTo manage database connections.
DTo manage user sessions.
Lời giải
Trong ASP.NET Core MVC, [Bind] là một thuộc tính quan trọng giúp xác định các thuộc tính của mô hình (model) nào sẽ được liên kết (bound) từ yêu cầu (request). Điều này cho phép bạn kiểm soát dữ liệu được gửi từ client đến server và ngăn chặn các thuộc tính không mong muốn được liên kết. Ví dụ, khi bạn tạo một form để thêm mới một tài khoản mới, bạn có thể sử dụng [Bind] để chỉ liên kết các thuộc tính cần thiết như tên, địa chỉ email và mật khẩu, mà không liên kết các thuộc tính khác như ID hoặc ngày tạo.
Mở trang câu hỏi này →
Đề bài
// Controller
public IActionResult Index()
{
   ViewBag.Message = "Hello from ViewBag!";
   ViewData["Title"] = "My Page Title";
   return View();
}

// View
<p>@ViewBag.Message</p>
<h1>@ViewData["Title"]</h1>
ATo store data persistently across multiple requests.
BTo pass data from a controller action to a view.
CTo manage user sessions.
DTo encrypt sensitive data.
Lời giải
Đáp án đúng: "To pass data from a controller action to a view". ViewBag và ViewData là hai cơ chế truyền dữ liệu MỘT CHIỀU từ action của controller sang view trong phạm vi cùng một request: ViewData là từ điển kiểu object nên phải ép kiểu khi dùng, còn ViewBag là lớp bọc dynamic quanh chính từ điển đó nên viết gọn hơn. Cả hai đều mất giá trị ngay khi request kết thúc, vì vậy phương án "To store data persistently across multiple requests" sai - muốn giữ dữ liệu qua nhiều request phải dùng TempData hoặc Session. Quản lý phiên (tức "To manage user sessions") là việc của Session; còn mã hoá dữ liệu (tức "To encrypt sensitive data") không liên quan gì tới hai cơ chế này.
Mở trang câu hỏi này →
AIt stores data in memory only.
BIt stores data in session state or cookies, depending on configuration.
CIt stores data in the database.
DIt stores data in the file system.
Lời giải
Đáp án đúng: "It stores data in session state or cookies, depending on configuration". TempData dùng để giữ dữ liệu qua ĐÚNG một lần chuyển hướng, và nơi lưu phụ thuộc vào provider được cấu hình: mặc định trong ASP.NET Core là CookieTempDataProvider - lưu vào cookie đã mã hoá; nếu đăng ký SessionStateTempDataProvider thì dữ liệu nằm trong session state. Vì vậy phát biểu đúng là lưu trong session hoặc cookie tuỳ cấu hình. Phương án "It stores data in memory only" sai vì dữ liệu không chỉ nằm trong bộ nhớ tiến trình; các phương án "It stores data in the database" và "It stores data in the file system" sai vì TempData không ghi xuống cơ sở dữ liệu hay hệ thống tệp.
Mở trang câu hỏi này →
Đề bài
// Controller
ViewData["Number"] = 123; // ViewData requires casting in the view.
ViewBag.Text = "Hello"; // ViewBag does not require casting.

//View
<p>Number: @((int)ViewData["Number"])</p>
<p>Text: @ViewBag.Text</p>
AViewBag is strongly typed, while ViewData is dynamically typed.
BViewData is strongly typed, while ViewBag is dynamically typed.
CBoth ViewBag and ViewData are strongly typed.
DBoth ViewBag and ViewData are dynamically typed.
Lời giải
Đáp án đúng: "Both ViewBag and ViewData are dynamically typed.". Cả ViewBag lẫn ViewData đều KHÔNG phải kiểu mạnh. ViewData là ViewDataDictionary, tức từ điển chuỗi - object, nên khi lấy ra phải ép kiểu như @((int)ViewData["Number"]) và lỗi ép kiểu chỉ lộ ra lúc chạy. ViewBag chỉ là lớp bọc dynamic quanh chính ViewData, nhờ dynamic mà viết @ViewBag.Text không cần ép kiểu nhưng cũng không được trình biên dịch kiểm tra. Vì vậy A, B và C đều sai khi gán nhãn "strongly typed" cho một trong hai. Muốn kiểu mạnh thì phải dùng view model với chỉ thị @model.
Mở trang câu hỏi này →

Đề có câu hỏi của chủ đề này

4 đề chứa ít nhất một câu thuộc chủ đề — mở đề để làm cả bộ, không chỉ từng câu.