【发布时间】:2015-08-29 03:06:20
【问题描述】:
我有一个资源服务,代码如下
function productResource($resource) {
return $resource("http://localhost/api/product/:id", null,
{
'update':{method:'PUT'}
});
我设置了一条路线来编辑这样的产品
.state("productEdit",
{
abstract: true,
url: "/products/edit/:id",
templateUrl: "app/products/productEditView.html",
controller: "productEditCtrl as vm",
resolve: {
productResource: "productResource",
product: function (productResource, $stateParams) {
var id = $stateParams.id;
return productResource.get({id: id}).$promise;
}
}
})
我的控制器是这样的
function productEditCtrl(product, productResource, $state) {
var vm = this;
vm.product= product;
if (vm.product.data && vm.product.data.id) {
vm.title = "Edit: " + vm.product.data.cusip;
}
else {
vm.title = "New product"
}
vm.submit = function(){
vm.product.$save(
function (data) {
toastr.success("Save Successful");
}
);
};
Web API 返回一个具有以下结构的动态对象
public class ResponseResult {
public dynamic Data { get; set; }
public HttpStatusCode StatusCode { get; set; }
public bool DataIsValid
}
webAPI 控制器操作如下所示
[Route("api/product/{productId}")]
[HttpGet]
public dynamic FindproductById(Guid productId)
{
productDto productDto = this.productManager.FindproductById(productId);
return new ResponseResult(productDto, HttpStatusCode.OK, productDto.ValidationResults, null);
}
[Route("api/product")]
[HttpPost]
public dynamic Createproduct(productDto productDto)
{
Verify.IsNotNull("product dto", productDto);
if (productDto.Id == Guid.Empty)
{
this.productManager.Createproduct(productDto);
}
return new ResponseResult(productDto, HttpStatusCode.OK, productDto.ValidationResults, null);
}
我的问题是当我调用 $save 函数时,它会返回空产品数据,因为 $save 与 ResponseResult 绑定,我需要将产品数据发送回 webapi。我不知何故需要将从 webapi 返回的产品数据绑定到 vm.product,所以当我调用 vm.product.$save 时,它可以工作。我该怎么做?
【问题讨论】:
-
web api 产品控制器/动作看起来如何?
-
马丁,我在问题中添加了控制器代码
-
您是否为
ResponseResult创建了一个空的构造函数?过去我遇到过缺少创建空构造函数的问题。 -
Simcha,空的构造函数没有任何区别。问题不在于 web api,而在于 $resource 是如何工作的。如果将 Web api 中 GET 的返回类型更改为 ProductDto 而不是 ResponseResult,则整个代码都可以正常工作。
-
为什么你的返回类型是
dynamic而不是IHttpActionResult,如果你想返回一些内容或者只是做一个return Ok(),你可以使用return Created<T>(string location, T content)