我的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;
}
}
我觉得这是一个很小的错误,可能是因为忽略太多了。希望有人可以寻求帮助。
答案 0 :(得分:2)
问题在于您在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)
会自动执行此操作。
希望这会有所帮助。
答案 1 :(得分:1)
从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();
}
答案 2 :(得分:0)
使用此功能,希望对您有用:
@using (Html.BeginForm("Index", "HomeController", FormMethod.Post))