5

我想更好地了解控制器方法如何知道何时应该从发布数据或 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)

现在,不知何故,该方法足够聪明,可以id在站点 URL 中Object查找第一个参数 , 和HTTPPost.

虽然这行得通,但我不知道为什么,结果我有时会遇到不可预测和不稳定的行为。例如,我似乎发现(尽管我不是 100% 确定)删除?fromint? id会使控制器方法立即假设它应该在 idHTTPPost而不是 URL 中查找。

所以我想澄清以下几点:

究竟是什么告诉方法在哪里寻找数据?([HttpPost]决定方法的属性?)

命名约定是否起作用?(例如删除?或不使用id作为变量名?)

放置变量的顺序是否有影响?(即放置在Object之前id

我知道我可以通过反复试验或多或少地弄清楚这些东西,但我想要一个合格的解释,而不是继续基于观察的假设工作。

谢谢

乔波

4

1 回答 1

5

看一下默认路由Global.asax

routes.MapRoute(
    "Default",                                            
    "{controller}/{action}/{id}",                     
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

MVC 将尝试做的第一件事是将您的方法参数映射到 POST 中的值。如果它没有找到匹配项,它将通过其他可能性级联,包括路由值。

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

  1. 之前绑定的动作参数,当动作是子动作时
  2. 表单域 (Request.Form)
  3. JSON 请求正文 (Request.InputStream) 中的属性值,但仅当请求是 AJAX 请求时
  4. 路线数据 (RouteData.Values)
  5. 查询字符串参数 (Request.QueryString)
  6. 发布的文件 (Request.Files)

您看到您描述的行为的原因是因为 POST 数据位于路由值之前。似乎 MVC 无法将可为空的 int 绑定到 POST 值,因此它跳过它并继续前进,直到它到达RouteData映射,此时它找到匹配并从路由中获取值。当您使参数不可为空时,它突然能够将其绑定到 POST 值,该值的优先级高于RouteData,所以它确实如此。

来源:http: //msdn.microsoft.com/en-us/magazine/hh781022.aspx

于 2013-04-26T09:41:48.653 回答