c# – ASP.NET MVC:控制器如何在URL中的参数之间进行distingush并通过POST发送
作者:互联网
我想更好地理解控制器方法如何知道何时应该从post数据或url中恢复它所回收的参数.
请看以下示例:
URL: /ModelController/Method/itemID
// Where itemID is the id (int) of the item in the database
POST: objectOrArray: {JSON Object/Array}
控制器看起来像这样:
[HttpPost]
public ActionResult InputResources(int? id, Object objectOrArray)
现在,该方法足够聪明,可以在站点URL中查找第一个参数id,在HTTPPost中查找Object.
虽然这有效,但我不知道为什么,因此我有时会遇到不可预测和不稳定的行为.例如,我似乎发现(尽管我不是100%肯定)删除?来自int? id使控制器方法立即假设它应该在HTTPPost中查找id而不是URL.
所以我想澄清以下几点:
究竟是什么告诉方法在哪里查找数据? ([HttpPost]属性预先确定方法?)
命名约定是否起作用? (例如,删除?或不使用id作为变量名?)
变量的排序顺序是否有影响? (即将id放在id之前)
我知道我可以通过反复试验来或多或少地弄清楚这些东西,但我想要一个合格的解释而不是继续基于观察的假设工作.
谢谢
Chopo
解决方法:
看一下Global.asax的默认路由:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
MVC将尝试做的第一件事是将方法参数映射到POST中的值.如果找不到匹配项,它将级联其他可能性,包括路径值.
这是模型绑定器使用的顺序:
- Previously bound action parameters, when the action is a child action
- Form fields (Request.Form)
- The property values in the JSON Request body (Request.InputStream), but only when the request is an AJAX request
- Route data (RouteData.Values)
- Querystring parameters (Request.QueryString)
- Posted files (Request.Files)
您看到所描述行为的原因是因为POST数据出现在路由值之前.似乎MVC无法将可空int绑定到POST值,因此它会跳过它并继续运行直到它到达RouteData映射,此时,它找到匹配并从路径获取值.当你使参数不可为空时,它突然能够将它绑定到POST值,后者的优先级高于RouteData,所以它确实如此.
资料来源:http://msdn.microsoft.com/en-us/magazine/hh781022.aspx
标签:c,asp-net-mvc,model-binding 来源: https://codeday.me/bug/20190520/1142660.html