Почему данные из представления не доходят до модели в ASP.NET?

У меня возникла проблема при создании базы знаний на asp.net core mvc: форма не привязывается к модели, и значения, которые я вводил, передаются в контроллер как null. Например, при заполнении полей формы (Code = T1, Description = qdqd, Subcategory = a) в метод контроллера приходит модель TCategory с пустыми значениями. Проведение проверки с помощью `!ModelState.IsValid` также указывает на это. Ниже приведен запрос, который отправляется (request body):

<pre><code>Request Body: __RequestVerificationToken=CfDJ8G0zu1sRLclEuYnE__Fjq1Bz6OtZ8W6ZNhRckZVzLNJxP2ycbakjwsVMN5M8laEGjPY5E5cKIecEtLU7Z1iTICLir7jS-D-QOKr28nMJq6Mih-91q8d5HB8pE_Mf3PVKYB2NvqHXaTrhqkdQ0tTQP3Q.</code></pre>

Вот класс модели TCategory:

<pre><code>public class TCategory
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    
    [Required(ErrorMessage = "Поле 'Code' обязательно для заполнения.")]
    public string Code { get; set; }
    
    [Required(ErrorMessage = "Поле 'Description' обязательно для заполнения.")]
    public string Description { get; set; }
    
    [Required(ErrorMessage = "Поле 'Subcategory' обязательно для заполнения.")]
    public string Subcategory { get; set; }
}</code></pre>

И вот часть кода контроллера:

<pre><code>[Route("[controller]")]
public class CategoriesController : Controller
{
    private readonly ApplicationDbContext _context;
    private readonly ILogger&lt;CategoriesController&gt; _logger;

    public CategoriesController(ApplicationDbContext context, ILogger&lt;CategoriesController&gt; logger)
    {
        _context = context;
        _logger = logger;
    }
</code></pre>

Можете подсказать, что может быть причиной такой проблемы с привязкой модели?
  • 3 апреля 2025 г. 12:35
Ответы на вопрос 2
Проблема с привязкой модели в ASP.NET Core MVC может возникать по нескольким причинам. Давайте рассмотрим основные моменты, которые стоит проверить для решения вашей проблемы.

1. **Имя полей формы**: Убедитесь, что имена полей вашей формы соответствуют именам свойств вашей модели. Например, для модели `TCategory`, вы должны иметь соответствующие HTML-поля в вашей форме:

   ```html
   <form method="post" asp-action="YourActionName">
       <input type="text" name="Code" />
       <input type="text" name="Description" />
       <input type="text" name="Subcategory" />
       <button type="submit">Отправить</button>
   </form>
   ```

   Если имена полей не соответствуют, привязка модели не сработает.

2. **Проверка атрибута `asp-for`**: Если вы используете теги-обертки Razor для генерации вашей формы, убедитесь, что вы используете атрибут `asp-for`, например:

   ```html
   <form method="post" asp-action="YourActionName">
       <input asp-for="Code" />
       <input asp-for="Description" />
       <input asp-for="Subcategory" />
       <button type="submit">Отправить</button>
   </form>
   ```

   Это автоматически устанавливает правильные имена для полей.

3. **Метод контроллера**: Убедитесь, что ваш метод контроллера принимает параметр типа `TCategory`. Например:

   ```csharp
   [HttpPost]
   public IActionResult YourActionName(TCategory category)
   {
       if (!ModelState.IsValid)
       {
           // Обработка ошибок
           return View(category);
       }

       // Логика, если модель валидна
   }
   ```

4. **Проверка CSRF-токена**: Если вы используете `[ValidateAntiForgeryToken]`, убедитесь, что вы добавили соответствующий токен на страницу формы, например:

   ```html
   @Html.AntiForgeryToken()
   ```

   Это необходимо для предотвращения CSRF-атак, и если токен не включен, форма не будет отправлена.

5. **Проверка HTML-формата**: Проверьте, что у вас нет ошибок в HTML-коде, которые могут повлиять на отправку данных. Например, не должно быть других полей с одинаковыми именами в рамках одной формы, что может привести к конфликтам.

6. **Проверка конфигурации модели**: Если вы используете сложные объекты или вложенные модели, убедитесь, что свойства имеют правильные имена. Например, если у вас есть объект внутри модели, имя поля будет требовать использования точки, пока вы не достигнете нужного свойства.

7. **Логи и ошибки**: Проверьте логи приложения на наличие ошибок, которые могут объяснить, почему данные не проходят через привязку модели.

Если вы проверите все эти моменты и проблема останется, пожалуйста, предоставьте больше информации о том, как вы реализуете форму, и метод контроллера, к которому она отправляется. Это позволит глубже проанализировать ситуацию.
Источник проблемы с привязкой действия: в теле ответа у вас нет ничего, кроме antiforgery token. Так что надо смотреть на клиенте HTML, который сгенерил движок представления - похоже, кривизна там, форма сгенерена неверно. 
Перед просмотром имеет смысл включить для окна/вкладки, где будет страница с формой, средства отладки браузера (F12) и смотреть ошибки, которые они выведут - может, они что найдут в авттоматическом режиме.

Конкретную причину ошибки я пока не опознаю. Подозрение у меня вызывает атрибут asp-for=Id для первого элемента формы: значения атрибутов tag helper чисто по синтаксису надо указывать в кавычках, потому что они подчиняются тому же синтаксису, что и обычные атрибуты HTML. Но в этом ли причина, утверждать не могу.
Похожие вопросы