Избегаем Null в Строках при Отправке Форм ASP.NET Core
Если перенести решение с ASP.NET Framework на ASP.NET Core 8, можно внезапно столкнуться с ошибкой 500. Ошибка происходит из-за исключения NullReferenceException. Рассмотрим метод действия:
[HttpPost("/")]
public ActionResult Index(
[FromForm] MyForm myForm)
{
if(myForm.Input1.Length > 0)
{
// Что-то делаем…
}
return Ok();
}
public class MyForm
{
public string Input1 { get; init; }
}Вроде ничего странного, правда? Только обработку ошибок убрали для краткости. А вот код, который отправлял форму:
const formData = new URLSearchParams();
formData.append('Input1', '');
fetch('/', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: formData.toString()
})
.then(response => response.json())
.then(data => {
console.log('Success:', data);
})
.catch((error) => {
console.error('Error:', error);
});
Здесь важно то, что Input1 установлен в пустую строку
''. Но при отправке пустой строки ASP.NET Core не устанавливает соответствующее свойство в пустую строку. Вместо этого он устанавливает его в значение null.Это можно исправить несколькими способами.
Для конкретной конечной точки
Использовать атрибут DisplayFormat:
public class MyForm
{
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string Input1 { get; init; }
}
Глобально
Написать реализацию IDisplayMetadataProvider, которая устанавливает ConvertEmptyStringToNull в false для всех строковых свойств:
public class EmptyStringDisplayMetadataProvider :
IDisplayMetadataProvider
{
public void CreateDisplayMetadata(
DisplayMetadataProviderContext context)
{
if (context.Key.ModelType == typeof(string))
context.DisplayMetadata
.ConvertEmptyStringToNull = false;
}
}
Использование:
// …
builder.Services.Configure<MvcOptions>(opts =>
{
opts.ModelMetadataDetailsProviders
.Add(new EmptyStringDisplayMetadataProvider());
});
// …
Источник: https://josef.codes/dont-let-asp-net-core-set-empty-strings-to-null-when-posting-forms/