我有一个冗长的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标记都有相应的结束标记。
答案 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>