2014-11-02 2 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); 
     } 
    } 

Update Изменено в

// 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

Вы выполняете две функции, каждый из которых вносит запрос асинхронный:

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

Это не чувствует себя хорошо - как запросы направляются параллельно, и никто не ждет другого. Вы действительно это имеете в виду?

Я бы либо упаковал, либо отправил все данные по одному запросу (также лучший опыт для пользователя), а затем позвольте серверу иметь дело с неспаковкой. Или, если один запрос должен ждать другой, ЦЕПЬ Обещания возвращаемые $http:

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

или использовать $q.all(promises) вместо этого.

EDIT.

Также более чистым и более масштабируемым подходом является использование выделенного Углового Service для размещения ваших данных, см., Например, пример на Angular Homepage

+0

Я не был уверен, как это сделать, но использование обещаний имеет смысл. Но я до сих пор не знаю, как отправить данные PurchaseOrderDetail на apiController? – texas697

+0

Единственные примеры, которые я нашел в Интернете, которые показывают, как отправлять несколько записей, - это строго типизированные проекты. – texas697

+0

@ texas697 Ваш запрос ajax выглядит хорошо, вы можете попробовать http://requestb.in/, чтобы узнать, как поступает ваш запрос, а затем отдельно проверить свою конечную точку PHP. Многие примеры там, посмотрите на Angular/PHP. –

0

Я думаю, что проблема с вами жулик troller попробуйте использовать это, а также вы можете уточнить проблему. Ваш API-контроллер никогда не найден вашим контроллером?

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

} 
+0

ОК, я изменил apiController на HttpResponseMessage вместо async. Но мне все еще нужно установить Угловой контроллер для отправки данных и «строк». прямо сейчас это не делает. Я не знаю, как объединить 2 – texas697

+0

, но мне любопытно, почему вы предложили мне изменить асинхронный режим на HttpResponse? – texas697

+0

Я использую то же самое, где я пытаюсь добавить несколько записей, и мой контроллер делает HTTP-запрос $ http.post ('/ api/nameofcontroller /', this.newOrder) .success ... –

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 в контроллере апи.

как раз в качестве опоры, я бы рекомендовал вам использовать stronger unique identifier вместо того, чтобы использовать случайное число.

Смежные вопросы