1、问题现象
POST提交时,控制的Action接收到的参数为null,但Request.Form、Request.Params等集合其实是包含提交的所有数据的。如下截图:
2、该问题很诡异,重新创建视图、控制器,问题仍然存在;
3、确定控制器肯定是没有问题后,决定首先将视图中的内容清空,发现可以正常接受到参数;
4、每次增加一个HTML元素,加到Model时,发现接收不到参数;
5、确定问题:当Action中的参数名称与提交的数据KEY有相同时(不区分大小写),会导致Action接收不到参数,只能得到null,估计是MVC在分析参数时的BUG。
6、视图代码
此视图中包括Id、Field1、Name、Model4个表单数据,那么Action的参数名称为此4个中的任何一个时(不区分大小写),都会导致接收到的参数为null。
@model WebMvc1.Models.ProductInfo @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Create</title> </head> <body> <script src="~/Scripts/jquery-1.10.2.min.js"></script> <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>ProductInfo</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> <label for="Field1">Id</label> <div class="col-md-10"> <input id="Id" name="Id" type="text" /> </div> </div> <div class="form-group"> <label for="Field1">Field1</label> <div class="col-md-10"> <input id="Field1" name="Field1" type="text" /> </div> </div> <div class="form-group"> <label for="Field1">Name</label> <div class="col-md-10"> <input id="Name" name="Name" type="text" /> </div> </div> <div class="form-group"> <label for="Field1">Model</label> <div class="col-md-10"> <input id="Model" name="Model" type="text" /> </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> </body> </html>
运行时视图效果如下:
7、控制器代码,参数名称为model,与视图中提交的数据有相同名称(Model)。
[HttpPost] public ActionResult Create(ProductInfo model) { return View(model); }
8、将Action中的参数名称改为不与Form中的数据相同的其他名称时,问题解决。如下图:
8、哪位大神如果有时间,可以跟踪一下MVC的源码,确定该问题的真正原因。
9、MVC4、MVC5都有此问题出现。