2013-12-13 43 views
1

我看到这个代码在书上,是与客户端创建一个对象(雇员,在这种情况下)提供ID的例子:这段代码是详细的还是我误解了?

public HttpResponseMessage Put(int id, Employee employee) 
{ 
    if (!list.Any(e => e.Id == id) 
    { 
     list.Add(employee); 

     var response = Request.CreateResponse<Employee>(HttpStatusCode.Created, employee); 

     string uri = Url.Link("DefaultApi", new { id = employee.Id }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 
    return Request.CreateResponse(HttpStatusCode.NoContent); 
} 

我知道如何工作,但不会下缩写代码也适用:

public HttpResponseMessage Put(Employee employee) 
{ 
    if (!list.Any(e => e.Id == employee.Id) 
    { 
     list.Add(employee); 

     var response = Request.CreateResponse<Employee>(HttpStatusCode.Created, employee); 

     string uri = Url.Link("DefaultApi", new { id = employee.Id }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 
    return Request.CreateResponse(HttpStatusCode.NoContent); 
} 

+1

带'PUT'动词的路由'api/employee/{id}'?如果是这样,你需要'id'参数。 –

+1

@David为什么你需要将id作为参数,如果employee参数已经有相同的赋值? – varevarao

+1

@varevarao也许约定;也许被传递的模型没有定义id。当您更新应该可以通过唯一URI访问的现有资源时,可能需要符合REST。 –

回答

1

你的建议,详细的解决方案少并没有错,它只是改变了的ASP.NET Web API如何查找您正在传递中的值缺省机制。

id是一个简单的类型,所以ASP.NET Web API将在请求URI中查找该值,而Employee是一种复杂类型,因此ASP.NET Web API需要在请求正文中查找。因此,如果您的路由设置要求id成为URI的一部分,那么将id作为一个单独的参数会更有意义,因为它将自动从URI中选取。

您可以指示的ASP.NET Web API使用你的参数[FromUri]属性,像这样的请求URI看:

public HttpResponseMessage Put([FromUri]Employee employee) 
{ 

} 

现在,如果你传递一个Employee对象的组成部分中请求的查询字符串,那么的ASP.NET Web API将挑选出的这些信息,并建立从Employee对象,像这样:

http://localhost/api/values/?FirstName=John8&LastName=Doe 

注意:我正在弥补FirstNameLastName的名称,但它们需要匹配您的模型类的public属性。


欲了解更多信息,请阅读Parameter Binding in ASP.NET Web API

2

如果PUT路线/ API方法被定义为api/employee/{id},那么你就需要在id过去了。但是,如果你Employee对象已有的ID,那么你可能只是有api/employee路线为PUT动词并且只需接受像第二个示例所示的Employee对象。

example的Web API,文档指出:

默认情况下,ASP.NET的Web API框架从请求主体的路线和复杂类型只接受简单的参数类型 。

相关问题