یک نکتهی تکمیلی: استفاده از System.Text.Json در ASP.NET Core 3.0 و از کار افتادن تعدادی از اکشن متدها
فرض کنید مدلی را به این صورت تعریف کردهاید:
public class ModelIdViewModel
{
public string Id { set; get; }
}
و اکشن متدی که آنرا دریافت میکند، به این نحو تعریف شدهاست:
public async Task<IActionResult> RenderRole([FromBody]ModelIdViewModel model)
در سمت کلاینت نیز اطلاعات Ajax ای متناظر با آنرا به صورت زیر ارسال میکنید:
data: JSON.stringify({ "id": 1 }),
contentType: "application/json; charset=utf-8",
dataType: "json",
این اکشن متد تا نگارش 2.2، بدون مشکل کار میکرد. اما اکنون در نگارش 3، مقدار model آن نال شدهاست.
برای دیباگ آن اگر قطعه کد زیر را اضافه کنیم:
public async Task<IActionResult> RenderRole([FromBody]ModelIdViewModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
یک چنین خروجی در قسمت network ابزارهای توسعه دهندگان مرورگر، ظاهر میشود:
{"$.id":["The JSON value could not be converted to System.String. Path: $.id | LineNumber: 0 | BytePositionInLine: 7."]}
عنوان میکند که مقدار id دریافتی را نمیتواند به string تبدیل کند.
برای رفع این مشکل، فقط کافی است نوع Id را در model به int تبدیل کرد:
public class ModelIdViewModel
{
public int Id { set; get; }
}
به عبارتی System.Text.Json جدید، همانند Newtonsoft.Json قبلی، سعی نمیکند int دریافتی از کاربر را به string درخواستی در model تبدیل کند. نوعها حتما باید تناظر داشته باشند.