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都有此問題出現。