HTTP POST无法找到ASP.NET MVC控制器方法并将ViewModel绑定到它

时间:2016-02-18 16:29:44

标签: asp.net asp.net-mvc asp.net-core asp.net-core-mvc

我有一个冗长的ViewModel类,我使用HTTPPost向控制器POST,但控制器方法没有捕获它,而是在我的浏览器控制台日志中,我得到HTTP 500 POST错误

简化我的代码就像这样

public class MyDataViewModel{
    public int Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }
    public string Property4 { get; set; }
    //etc to Property 100
}

CSHTML:

<form action="@(Url.Action("Edit", "MyData"))" id="myform" class="myform" method="post">

@Html.AntiForgeryToken()

<div class="form-horizontal">
    @Html.ValidationSummary(true)

    @Html.EditorFor(model => model.Property1)
    //...

    @Html.EditorFor(model => model.Property100)

某些属性使用数据注释。

当我从客户端提交时,验证确实可以正常工作,如果未捕获必填字段,则在提交之前阻止帖子。

然而,在表单提交后,我的控制器中的POST方法没有被点击。我通过在其上设置断点以及在浏览器控制台日志中查看HTTP 500错误来验证这一点。

这是方法

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(MyDataViewModel myDataViewModel)
{

但是,当我将方法参数更改为对象时,即

public async Task<IActionResult> Edit(object myDataViewModel)
它确实受到了打击。然后我尝试将该对象投射到(MyDataViewModel)myDataViewModel投射失败,所以事情并不正确。

我已经通过fiddler查看了确认所有这些数据属性的发送方式。

然后我尝试了以下内容:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(object myDataViewModel)
    {



        Type myType = myDataViewModel.GetType();
        IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());

        foreach (PropertyInfo prop in props)
        {
            object propValue = prop.GetValue(myDataViewModel, null);

            // Do something with propValue
        }
    }

看看我是否能找到哪个属性有问题。但是props.Count = 0表示对象为空。为什么fiddler会显示所有这些领域,但MVC没有收到它?这毫无意义

我在其他页面上使用相同的类型表单,使用相同的<form>标记和发布哪些工作方法,因此不确定为什么会失败。

在Visual Studio中,我可以折叠包含<form>标记的cshtml中的各种html标记,这样就不会发现任何可疑内容,并显示每个html标记都有相应的结束标记。

2 个答案:

答案 0 :(得分:1)

我最终创建了一个虚拟视图模型,使用这个虚拟视图模型类型作为HTTPPost参数,并一次输入真实视图模型的一些属性,编译解决方案,测试,直到我到达它的位置没有命中POST控制器方法..

花了一段时间,但我最终找到了罪魁祸首。

    [Required, Display(Name = "Flag"),StringLength(50)]
    public bool IsFlag{ get; set; }

我对bool字段使用了数据注释StringLength,这对bool无效。

这导致前端在HTTPPost和HTTPPost方法控制器方法无法命中之前未显示任何客户端验证jquery.validate错误。

如果有更快的方法来解决这类问题,或者确定哪个属性有问题我仍然愿意,因为我使用的方法非常费力。

答案 1 :(得分:0)

在我的情况下,我忘了把公共&#34;在后期行动中。很困惑我很久了。此外,如果post动作有问题,它将进入get动作(如果你没有专门将HttpGet放在那里),它会让你想知道为什么我点击按钮但仍然进入get动作。< / p>