- vừa được xem lúc

[ASP.NET Core MVC] Input value không thay đổi

0 0 4

Người đăng: Nam Pham

Theo Viblo Asia

Vấn đề

Trong ứng dụng ASP.NET Core MVC của mình có 1 page chứa 1 form mà sau khi submit cần modify data, sau đó hiển thị lại data.

Trước khi giải quyết

Code

public class HomeController : Controller
{ [HttpGet] public IActionResult Index() { var model = new IndexViewModel { Name = "Nam" }; return View(model); } [HttpPost] public IActionResult Index(IndexViewModel model) { model.Name += " - Updated"; return View(model); }
}

View

@model IndexViewModel
@using (Html.BeginForm())
{ <input type="text" asp-for="Name" /> <span>@Model?.Name</span> <button type="submit">Submit</button>
}

Với code trên thì, Html trước khi submit

<form action="/" method="post"> <input type="text" id="Name" name="Name" value="Nam"> <span>Nam</span> <button type="submit">Submit</button>
</form>

Như chúng ta thấy thì html không có vấn đề gì, cả input value và span text đều render như ý định. Tuy nhiên kết quả sẽ như thế nào sau khi submit? input value và span text là Nam - Updated ư? Không. Đây là html sau khi post.

<form action="/" method="post"> <input type="text" id="Name" name="Name" value="Nam"> <span>Nam - Updated</span> <button type="submit">Submit</button>
</form>

span text thì như ý định, còn text value thì như trước post.

Cách giải quyết

Cách 1: Dùng ModelState.Clear()

Code

public class HomeController : Controller
{ [HttpGet] public IActionResult Index() { var model = new IndexViewModel { Name = "Nam" }; return View(model); } [HttpPost] public IActionResult Index(IndexViewModel model) { ModelState.Clear(); // <-- Add here model.Name += " - Updated"; return View(model); }
}

Cách 2: Dùng ModelState.Remove();

public class HomeController : Controller
{ [HttpGet] public IActionResult Index() { var model = new IndexViewModel { Name = "Nam" }; return View(model); } [HttpPost] public IActionResult Index(IndexViewModel model) { ModelState.Remove(nameof(model.Name)); // <-- Add here model.Name += " - Updated"; return View(model); }
}

Kết quả. Trước khi submit (không có gì thay đổi). Sau khi submit , cả input value và span text đều render như mong đợi.

<form action="/" method="post"> <input type="text" id="Name" name="Name" value="Nam - Updated"> <span>Nam - Updated</span> <button type="submit">Submit</button></form>

Giải thích

Khi post thì đầu tiên data sẽ được nạp vào ModelState. Khi dùng TagHelper asp-for cho input thì đầu tiên framework sẽ tìm key ở trong ModelState. Nếu thấy thì sẽ dùng value được lưu trong ModelState. Còn nếu không thấy thì mới dùng value ở trong model. Ở ví dụ trên, khi post thì giá trị của Name được lưu trong ModelState luôn là giá trị mà ta đã submit nên value của input luôn là giá trị mà ta đã submit. Sau khi xóa toàn state của ModelState thì input value sẽ được lấy từ model.

Nguồn tham khảo: https://www.sukerou.com/2021/05/aspnet-mvchidden.html

Bình luận

Bài viết tương tự

- vừa được xem lúc

10 điều cần biết về In-Memory Caching trong ASP.NET Core

Mục đính chính của bất kỳ cơ chế caching nào cũng là để cải thiện hiệu suất của ứng dụng. Với một lập trình viên ASP.

0 0 51

- vừa được xem lúc

#1 Khởi tạo Project - Tạo một API đơn giản bằng ASP.NET CORE 5

Tổng quan. Hiện mình đang làm một dự án trên công ty và API được viết bằng ASP.NET Core. Thấy tạo API trong ASP.

0 0 142

- vừa được xem lúc

#2 Controller - Tạo một API đơn giản bằng ASP.NET CORE 5

Tổng quan. Bài trước mình đã khởi tạo một project ASP.NET Core 5 API trên Visual Studio 2019. Trong bài này, chúng ta hãy cùng nhau tìm hiểu về controller trong ASP.

0 0 62

- vừa được xem lúc

Tổng quan về Dependency Injection - Sử dụng Dependency Injection trong .NET CORE

1. Khái niệm.

0 0 80

- vừa được xem lúc

Áp dụng Cookie Authentication trong ASP .NET Core không dùng Identity

Cookie là một tệp văn bản chứa dữ liệu mà các trình duyệt web có thể truy cập, thông thường là những dữ liệu thời gian ngắn. Cookie Authentication là một khái niệm trong đó một số ngữ cảnh đã được xác

0 0 74

- vừa được xem lúc

Policy-Based Authorization trong ASP. NET Core

Trong bài biết này chúng ta sẽ tìm hiểu về Policy-Based Authorization trong ASP .NET Core.

0 0 34