编程语言
首页 > 编程语言> > c# – ASP.NET MVC:控制器如何在URL中的参数之间进行distingush并通过POST发送

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中的值.如果找不到匹配项,它将级联其他可能性,包括路径值.

这是模型绑定器使用的顺序:

  1. Previously bound action parameters, when the action is a child action
  2. Form fields (Request.Form)
  3. The property values in the JSON Request body (Request.InputStream), but only when the request is an AJAX request
  4. Route data (RouteData.Values)
  5. Querystring parameters (Request.QueryString)
  6. 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