Метод действия контроллера POST имеет параметр NULL ViewModel

Мой POST-контроллер не может захватить параметр ViewModel, который я установил, и я очень смущен, так как у меня другой набор POST-контроллера, и он может захватить параметр ViewModel.

Мой код выглядит так,

Просмотр страницы

@model MyProject.Web.ViewModels.MyViewModel

@{
    ViewBag.Title = "Home";
    ViewBag.Description = "My Project";
    ViewBag.SubDescription = "My Project Tool";
    Layout = null;
}

@using (Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Filter)
    <input type = "submit" class = "btn btn-primary btn-inline-right input-tab" value = "Search" />
}

Контроллер

using MyProject.Web.ViewModels;

[HttpGet]
[Route("Home/Index")]
public async Task<ActionResult> Index()
{
    ...await API integration code here...

    return View(MyViewModel);
}

[HttpPost]
[Route("Home/Index/{viewmodel}")]
public ActionResult Index(MyViewModel viewmodel) <-- all properties of viewmodel are NULL
{
    return View();
}

Посмотреть модель

using MyProject.Web.Models;
using System.Collections.Generic;

namespace MyProject.Web.ViewModels
{
    public class MyViewModel 
    {
        public User UserInfo;
        public List<Client> Clients;

        public string Filter;
    }
}

Я чувствую, что это очень маленькая ошибка, возможно, из-за того, что я слишком много упускаю из виду. Надеюсь, кто-то мог взглянуть и помочь.

Покажите нам свой почтовый запрос.

Yan 10.04.2019 08:33
"Home/Index/{viewmodel}" кажется немного странным маршрутом, так как viewmodel сложный объект
Risto M 10.04.2019 08:39

@Yan - я запускаю его локально, и пост невелик. Но данные формы показывают Фильтр=testFilterValue. Не могли бы вы указать конкретную часть, которую вы хотели бы видеть?

Lex 10.04.2019 08:39

@RistoM - что ты имеешь в виду? Это из-за списка?

Lex 10.04.2019 08:43

@Lex, вы можете попробовать дать имя своему входу, которое сопоставляется с вашим свойством модели представления с именем filter, например <input name = "filter"> </input> , и посмотрите, получите ли вы значение в свойстве filter вашей модели представления. и удалите маршрут из верхней части вашего сообщения

Zeeshan Adil 10.04.2019 09:22

@ZeeshanAdil - кажется, работает, так что хороший обходной путь.

Lex 10.04.2019 09:56

хорошо, я думаю, проблема с вашим маршрутом, вы можете вернуться к старому решению и просто удалить маршрут?

Zeeshan Adil 10.04.2019 09:57

@RistoM - возможно, вы правы. я попытался упростить его, используя список клиентов в качестве модели в представлении вместо сложной модели представления. Но все же стремлюсь найти правильное решение по этому поводу. Так как гораздо удобнее иметь модель представления, содержащую всю необходимую информацию - и чистый.

Lex 10.04.2019 09:58

@Lex, посмотри на мой ответ, чтобы понять, что происходит.

Zeeshan Adil 10.04.2019 10:02

Теги ввода @ZeeshanAdil самозавершаются, поэтому <input name = "filter"> </input> никогда не будет действительным.

Tieson T. 10.04.2019 10:03

@ТисонТ. Ты прав, мой плохой.

Zeeshan Adil 10.04.2019 10:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
587
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

используйте это, я надеюсь, полезно:

@using (Html.BeginForm("Index", "HomeController", FormMethod.Post))

Пробовал, но не работает. Боюсь, результат такой же, как и раньше.

Lex 10.04.2019 08:44

вы можете удалить атрибут маршрута, проверьте эту ссылку, я надеюсь, она будет полезна: stackoverflow.com/questions/20333021/…

hassan.ef 10.04.2019 09:14
Ответ принят как подходящий

Проблема с маршрутом, который вы определили в верхней части вашего Post действия [Route("Home/Index/{viewmodel}")]

Вам не нужен этот {viewmodel} в этом URL-адресе, поскольку вы ничего не публикуете в строке запроса, вы публикуете сложный объект внутри тела вашего HTTP-сообщения.

Удалите этот route, и он должен работать.

Кроме того, ASP.NET mvc сопоставляет входные данные со свойствами модели на основе их атрибутов name, например, <input name = "abc"> сопоставляет эти входные данные со свойством с именем abc в ViewModel или просто с параметром. В вашем случае @Html.TextBoxFor(m => m.Filter) делает это автоматически.

Надеюсь это поможет.

Изменить с public string Filter на свойство public string Filter {get;set;}

и измените маршрут на [Route("Home/Index")] вместо [Route("Home/Index/{viewmodel}")].

Я проверил, и это сработало.

public class MyViewModel
    {
        public User UserInfo { get; set; }
        public List<Client> Clients { get; set; }
        public string Filter { get; set; }
    }

[HttpPost]
[Route("Home/Index")]
public ActionResult Index(MyViewModel viewmodel)
{
    return View();
}

Другие вопросы по теме