Данные из модели не передаются в представление в ASP.NET
Создаю базу знаний на asp.net core mvc. Не могу понять, почему не привязывается модель к представлению. Я заполняю форму данными (например Code = T1, Description = qdqd, Subcategory = a), но в в метод контроллера передаётся модель с полями, равными null.
Request Body: __RequestVerificationToken=CfDJ8G0zu1sRLclEuYnE__Fjq1Bz6OtZ8W6ZNhRckZVzLNJxP2ycbakjwsVMN5M8laEGjPY5E5cKIecEtLU7Z1iTICLir7jS-D-QOKr28nMJq6Mih-91q8d5HB8pE_Mf3PVKYB2NvqHXaTrhqkdQ0tTQP3Q.
В чём может быть дело? Код модели:
public class TCategory
{
public TCategory() { } // Конструктор по умолчанию
[Key] // Явное указание первичного ключа (необязательно, если свойство называется Id)
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // Автоинкремент
public int Id { get; set; }
[Required(ErrorMessage = "Поле 'Code' обязательно для заполнения.")]
public string Code { get; set; } // TX, Tis, T1-T4
[Required(ErrorMessage = "Поле 'Description' обязательно для заполнения.")]
public string Description { get; set; }
[Required(ErrorMessage = "Поле 'Subcategory' обязательно для заполнения.")]
public string Subcategory { get; set; }
}
Модель представления:
// ViewModels/CreateTCategoryViewModel.cs
public class CreateTCategoryViewModel
{
public CreateTCategoryViewModel(string code, string description, string subcategory)
{Code = code; Description = description; Subcategory = subcategory; }
public CreateTCategoryViewModel()
{ }
[Required(ErrorMessage = "Поле 'Code' обязательно для заполнения.")]
[Display(Name = "Код (например, T1, T2)")]
public string Code { get; set; }
[Required(ErrorMessage = "Поле 'Описание' обязательно для заполнения.")]
[Display(Name = "Описание")]
public string Description { get; set; }
[Required(ErrorMessage = "Поле 'Подкатегория' обязательно для заполнения.")]
[Display(Name = "Подкатегория")]
public string Subcategory { get; set; }
}
Контроллер:
[Controller]
//[Route("api/[controller]")]
public class CategoriesController : Controller
{
private readonly ApplicationDbContext _context;
private readonly ILogger<CategoriesController> _logger;
public CategoriesController(ApplicationDbContext context, ILogger<CategoriesController> logger)
{
_context = context;
_logger = logger;
}
[HttpGet("CreateT")]
public IActionResult CreateT()
{
return View(new CreateTCategoryViewModel());
}
[HttpPost("CreateT")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> CreateT([Bind("Code, Description, Subcategory")] CreateTCategoryViewModel tCategory)
{
if (ModelState.IsValid)
{
try
{
_context.Add(tCategory);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
catch (Exception ex)
{
ModelState.AddModelError("", "Ошибка при сохранении данных: " + ex.Message);
}
}
else
{
// Отладка: выводим ошибки валидации
foreach (var modelState in ModelState.Values)
{
foreach (var error in modelState.Errors)
{
Console.WriteLine(error.ErrorMessage);
}
}
}
return View(tCategory);
}
///////////////////////////////////
Форма:
<!-- Views/Categories/CreateT.cshtml -->
@model MedicalKnowledgeBase.ViewModels.CreateTCategoryViewModel
<h2>Создать T категорию</h2>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<form method="post" asp-action="CreateT" asp-controller="Categories">
@Html.AntiForgeryToken()
<div class="form-group">
<label asp-for="Code"></label>
<input asp-for="Code" class="form-control" />
<span asp-validation-for="Code" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Description"></label>
<input asp-for="Description" class="form-control" />
<span asp-validation-for="Description" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Subcategory"></label>
<input asp-for="Subcategory" class="form-control" />
<span asp-validation-for="Subcategory" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Создать</button>
</form>
Ответы (1 шт):
Автор решения: Faraday
→ Ссылка
Попробуйте вместо Bind использовать [FromRoute] что бы явно указать, откуда должна приходить информация для запроса