Мой 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;
}
}
Я чувствую, что это очень маленькая ошибка, возможно, из-за того, что я слишком много упускаю из виду. Надеюсь, кто-то мог взглянуть и помочь.
"Home/Index/{viewmodel}"
кажется немного странным маршрутом, так как viewmodel
сложный объект
@Yan - я запускаю его локально, и пост невелик. Но данные формы показывают Фильтр=testFilterValue. Не могли бы вы указать конкретную часть, которую вы хотели бы видеть?
@RistoM - что ты имеешь в виду? Это из-за списка?
@Lex, вы можете попробовать дать имя своему входу, которое сопоставляется с вашим свойством модели представления с именем filter, например <input name = "filter"> </input>
, и посмотрите, получите ли вы значение в свойстве filter вашей модели представления. и удалите маршрут из верхней части вашего сообщения
@ZeeshanAdil - кажется, работает, так что хороший обходной путь.
хорошо, я думаю, проблема с вашим маршрутом, вы можете вернуться к старому решению и просто удалить маршрут?
@RistoM - возможно, вы правы. я попытался упростить его, используя список клиентов в качестве модели в представлении вместо сложной модели представления. Но все же стремлюсь найти правильное решение по этому поводу. Так как гораздо удобнее иметь модель представления, содержащую всю необходимую информацию - и чистый.
@Lex, посмотри на мой ответ, чтобы понять, что происходит.
Теги ввода @ZeeshanAdil самозавершаются, поэтому <input name = "filter"> </input>
никогда не будет действительным.
@ТисонТ. Ты прав, мой плохой.
используйте это, я надеюсь, полезно:
@using (Html.BeginForm("Index", "HomeController", FormMethod.Post))
Пробовал, но не работает. Боюсь, результат такой же, как и раньше.
вы можете удалить атрибут маршрута, проверьте эту ссылку, я надеюсь, она будет полезна: stackoverflow.com/questions/20333021/…
Проблема с маршрутом, который вы определили в верхней части вашего 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();
}
Покажите нам свой почтовый запрос.