POST控制器操作方法具有NULL ViewModel参数

时间:2019-04-10 06:09:15

标签: c# asp.net .net asp.net-mvc

我的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;
    }
}

我觉得这是一个很小的错误,可能是因为忽略太多了。希望有人可以寻求帮助。

3 个答案:

答案 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))