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

问题描述 投票:1回答:3

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

我觉得这是一个非常小的错误,可能是因为忽视了太多。希望有人可以看看和帮助。

c# asp.net .net asp.net-mvc
3个回答
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
投票

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();
}

0
投票

使用这个我希望有用:

@using (Html.BeginForm("Index", "HomeController", FormMethod.Post))
© www.soinside.com 2019 - 2024. All rights reserved.