我的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;
}
}
我觉得这是一个非常小的错误,可能是因为忽视了太多。希望有人可以看看和帮助。
问题在于您在Post
动作[Route("Home/Index/{viewmodel}")]
顶部定义的路线
您不需要在该URL中使用{viewmodel}
,因为您没有在查询字符串中发布任何内容,而是在HTTP Post的正文中发布了一个复杂对象。
删除route
它应该工作。
另外,ASP.NET mvc根据name
属性将输入映射到Model属性,如<input name="abc">
将此输入映射到ViewModel上的名为abc
的属性或仅仅是参数。在你的情况下,@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();
}
使用这个我希望有用:
@using (Html.BeginForm("Index", "HomeController", FormMethod.Post))