PUT标识符应该来自URL还是来自HTTP请求数据?

时间:2012-06-02 17:44:13

标签: asp.net-mvc rest put restful-url

这个问题可能是一个骗局,但我找不到类似的问题(不确定究竟要搜索什么)。

假设我有一个像这样的宁静资源网址:

/my/items/6/edit

此页面上有一个表单,允许我编辑我的#6项目。当我提交表单时,它使用PUT X-HTTP-Method-Override标题发送到/my/items/6

我的问题是,服务器处理程序应该在哪里获取值" 6"从?它应该从URL获取吗?或者从HTTP POST数据(假设id被呈现为表单上的隐藏输入字段)?

在我看来它应该来自URL。然而,这使它更难以解决它。例如,在.NET MVC中,您可以从控制器操作方法获得它:

var id = int.Parse(ControllerContext.RouteData.Values["id"].ToString());

......这似乎比它的价值更麻烦。但是,如果我们从HTTP POST数据中获取它,那么从技术上讲,您可以将我的项目#6的数据发布/放置到/my/items/7,并且服务器仍然会将项目数据保存在id#6下。

这里有标准做法吗?

2 个答案:

答案 0 :(得分:1)

请检查:http://www.codeproject.com/Articles/190267/Controllers-and-Routers-in-ASP-NET-MVC-3

我不是.net开发人员,但所有平台的最佳实践都是将URI模板映射到控制器。路由器必须解析并准备此类信息并将其传递给您的函数/方法。

答案 1 :(得分:0)

它绝对应该来自URL。在ASP.NET MVC中,如果您的路由定义如下:

routes.MapRoute(
    "Default",
    "/my/{controller}/{id}/{action}",
    new { controller = "items", action = "Index" }
);

您可以从ActionResult方法签名中引用ID,如下所示:

[HttpPut]
public ActionResult Index(int id, MyItemEditModel model)
{
    // id would be 6 if the URL was /my/items/6/
    // and the model need not contain the id
    ...