2014-11-02 34 views
4

我正在嘗試使用多個表格行提交表單。我在網上找到了一些例子,並設法將表格數據發送到AngularJS控制器,但我無法弄清楚如何將數據發送到apiController。如何用AngularJS發佈多行

形式是採購訂單,有一個表,採購訂單的詳細信息。我已經將提交按鈕與採購訂單和採購訂單明細提交功能鏈接在一起。

<table class="table" style=""> 
    <tbody> 
     <tr class="pointer no_selection" ng-repeat="newJobItem in rows"> 
      <td style="width:50px"><input style="width:20px" type="checkbox" class="form-control"></td> 
      <td style="width:200px">{{newJobItem.JobItemName}}</td> 
      <td style="width:480px">{{newJobItem.JobItemDescription}}</td> 
      <td style="width:100px">{{newJobItem.JobItemMatSize}}</td> 
      <td style="width:150px">{{newJobItem.JobItemQuantity}}</td> 
      <td style="width:50px">{{newJobItem.JobItemUOM}}</td> 
      <td style="width:150px">${{newJobItem.JobItemPrice | number : fractionSize}}</td> 
      <td style="width:20px"><input type="button" value="X" class="btn btn-primary btn-sm" ng-click="removeRow(newJobItem.JobItemName)" /></td> 
     </tr> 

    </tbody> 
</table> 


<input style="margin-right:30px" id="btn-width" type="button" class="btn btn-default" ng-click="submitPurchaseOrder();submitPurchaseOrderDetail()" value="Submit"/> 

控制器

//Post Purchase Order 
$scope.PODate = new Date(); //Todays Date 
$scope.POId = Math.floor(Math.random() * 1000000001) //PurchaseOrder Id Generator 
$scope.submitPurchaseOrder = function() {; 
    var data = { 
     JobId: $scope.job.JobId, 
     POId : $scope.POId, 
     PONumber: $scope.currentItem.PONumber, 
     PODate: $scope.PODate, 
     POAmount: $scope.currentItem.POAmount, 
     POLastPrintDate: $scope.currentItem.POLastPrintDate, 
     POEmail: $scope.POEmail, 
     POPrint: $scope.currentItem.POPrint, 
     POFaxNumber: $scope.POFaxNumber, 
     PONotes: $scope.currentItem.PONotes, 
     POCreatedBy: $scope.currentItem.POCreatedBy, 
     PODeliveryDate: $scope.currentItem.PODeliveryDate, 
     POShipVia: $scope.currentItem.POShipVia, 
     POShowPrices: $scope.currentItem.POShowPrices, 
     POCostCode: $scope.currentItem.POCostCode, 
     POApprovedNumber: $scope.currentItem.POApprovedNumber, 
     POBackorder: $scope.currentItem.POBackorder, 
     } 
    $http.post('/api/apiPurchaseOrder/PostNewPurchaseOrder', data).success(function (data, status, headers) { 
     console.log(data); 
     var tmpCurrentItem = angular.copy($scope.currentItem); 
     $scope.purchaseOrderArray.push(tmpCurrentItem) 
     angular.copy({}, $scope.currentItem); 
     //hide modal window 
     $scope.openNewPurchaseOrderModal.then(function (m) { 
      m.modal('hide'); 
     }); 

    }); 
}; 
//Post Purchase Order Detail 
$scope.newJobItem = {}; 
$scope.submitPurchaseOrderDetail = function() { 
    var index = 0; 
    $scope.rows.forEach(function (newJobItem) { 
     console.log('rows #' + (index++) + ': ' + JSON.stringify(newJobItem)); 
    }); 
    var data = { 
     POId: $scope.POId, 
     PODItem: $scope.newJobItem.JobItemName, 
     PODDescription: $scope.newJobItem.JobItemDescription, 
     PODNotes: $scope.PODNotes, 
     PODUOM: $scope.newJobItem.JobItemUOM, 
     PODPrice: $scope.newJobItem.JobItemPrice, 
     PODQuantity: $scope.newJobItem.JobItemQuantity, 
     PODAmount: $scope.PODAmount, 
     PODMatSize: $scope.newJobItem.JobItemMatSize, 
     PODSection: $scope.PODSection, 
     PODMultiplier: $scope.PODMultiplier, 
     PODBackOrder: $scope.PODBackOrder 
    } 
    $http.post('/api/apiPurchaseOrderDetail/PostNewPurchaseOrderDetail', data).success(function (data, status, headers) { 
     console.log(data); window.top.location.reload(); 

    }); 
}; 

採購訂單詳細信息ApiController

// POST api/<controller> 

    public async Task<IHttpActionResult> PostnewPurchaseOrderDetail([FromBody]PurchaseOrderDetail newPurchaseOrderDetail) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     using (var context = new ApplicationDbContext()) 
     { 
      context.PurchaseOrderDetails.Add(newPurchaseOrderDetail); 
      await context.SaveChangesAsync(); 
      return CreatedAtRoute("PurchaseOrderDetailApi", new { newPurchaseOrderDetail.PODId }, newPurchaseOrderDetail); 
     } 
    } 

更新 按建議修改

// POST api/<controller> 
    public HttpResponseMessage PostNewPurchaseOrderDetail(int id, PurchaseOrderDetail newPurchaseOrderDetail) 
    { 
     ApplicationDbContext db = new ApplicationDbContext(); 
     if (!ModelState.IsValid) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
     } 

     if (id != newPurchaseOrderDetail.PODId) 
     { 
      return Request.CreateResponse(HttpStatusCode.BadRequest); 
     } 

     db.Entry(newPurchaseOrderDetail).State = EntityState.Modified; 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException ex) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex); 
     } 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 

回答

3

您正在執行兩個功能,使每一個asyncronous要求:

ng-click="submitPurchaseOrder();submitPurchaseOrderDetail()" 

這感覺不對 - 這兩個請求並行發送,沒有正在等待其他。你真的是這個意思嗎?

我要麼包和一個請求(用戶也更好的體驗)發送的所有數據,然後讓服務器處理未包裝。或者,如果一個請求需要等待另一個鏈承諾通過$http返回:

$http.post(...) 
    .then(function(){ 
     return $http.post(...); 
    }) 
    .success(...) 
    .fail(...); 

或使用$q.all(promises)來代替。

編輯。

另外一個更清潔,更靈活的方法是使用專用的角Service來發表您的數據,例如見示例上Angular Homepage

+0

我不知道該怎麼做,但使用承諾是有道理的。但我仍然不知道如何將PurchaseOrderDetail數據發送到apiController? – texas697 2014-11-08 19:24:56

+0

我在網上找到的唯一示例顯示如何提交多個記錄是強類型項目。 – texas697 2014-11-08 19:26:20

+0

@ texas697您的ajax請求看起來不錯,您可以嘗試http://requestb.in/來查看您的請求到達的方式,然後單獨測試您的PHP端點。那裏有很多例子,找Angular/PHP。 – 2014-11-11 09:34:09

0

我覺得麻煩的是與你CON troller嘗試使用這個,也可以請你詳細說明麻煩。你的API控制器是不是你的控制器找到?

public class Oders : ApiController // in your controller class 
{ 
public HttpResponseMessage Post(PurchaseOrderDetails newOrder) 
{ 
//your code 
} 

} 
+0

好吧,我修改了apiController到HttpResponseMessage而不是async。但我仍然需要設置Angular Controller來發送數據和「行」。現在它沒有這樣做。我不知道如何結合2 – texas697 2014-11-03 03:29:13

+0

,但我很好奇你爲什麼建議我將異步改爲HttpResponse? – texas697 2014-11-03 03:34:54

+0

我正在使用相同的東西,我試圖添加多個條目,我的控制器發出http請求 $ http.post('/ api/nameofcontroller /',this.newOrder).success ... – 2014-11-03 04:12:19

3

我不確定您的方法,對我來說,將兩個請求,purchaseOrder和詳細信息都加入到一個調用中會更好,但仍然可以將數據分開,因爲您可能覺得方便。

調用,同時這兩個功能可以有意外的行爲,因爲都在運行異步你會發現「比賽條件」。

試圖發送一個請求,並組織你將如何張貼像

var data = { 
    JobId: $scope.job.JobId, //common data between the order and the detail 
    POId: $scope.POId, 
    Order:{ 

     PONumber: $scope.currentItem.PONumber, 
     PODate: $scope.PODate, 
     POAmount: $scope.currentItem.POAmount, 
     POLastPrintDate: $scope.currentItem.POLastPrintDate, 
     POEmail: $scope.POEmail, 
     POPrint: $scope.currentItem.POPrint, 
     POFaxNumber: $scope.POFaxNumber, 
     PONotes: $scope.currentItem.PONotes, 
     POCreatedBy: $scope.currentItem.POCreatedBy, 
     PODeliveryDate: $scope.currentItem.PODeliveryDate, 
     POShipVia: $scope.currentItem.POShipVia, 
     POShowPrices: $scope.currentItem.POShowPrices, 
     POCostCode: $scope.currentItem.POCostCode, 
     POApprovedNumber: $scope.currentItem.POApprovedNumber, 
     POBackorder: $scope.currentItem.POBackorder, 
    }, 
    Detail:{ 
     PODItem: $scope.newJobItem.JobItemName, 
     PODDescription: $scope.newJobItem.JobItemDescription, 
     PODNotes: $scope.PODNotes, 
     PODUOM: $scope.newJobItem.JobItemUOM, 
     PODPrice: $scope.newJobItem.JobItemPrice, 
     PODQuantity: $scope.newJobItem.JobItemQuantity, 
     PODAmount: $scope.PODAmount, 
     PODMatSize: $scope.newJobItem.JobItemMatSize, 
     PODSection: $scope.PODSection, 
     PODMultiplier: $scope.PODMultiplier, 
     PODBackOrder: $scope.PODBackOrder 
    } 

} 

你需要採購訂單和細節,以一個單一的DTO對象映射在您的API控制器的信息。

只是作爲一個旁註,我建議你使用stronger unique identifier而不是使用一個隨機數。