2017-07-10 2 views
0

Ich habe Winkelregler für erhalten und Post einige Daten. Ich habe zwei Controller gemacht, um richtig zu arbeiten, und jetzt, als ich den dritten gemacht habe, mit dem Mischen von zwei vorherigen Controllern get und post funktioniert nicht. Könnten Sie helfen, ein Problem zu finden? Hier ist ein Code. sparePartController.js //sparePartController.jsOption mit Winkel- und .net-Kern wählen

(function() { 

    "use strict"; 

    angular.module("app") 
     .controller("sparePartController", sparePartController); 

    function sparePartController($http) 
    { 
     var vm = this; 

     vm.spareParts = []; 

     vm.newSparePart = {}; 

     vm.errorMessage = ""; 

     vm.isBusy = true; 

     $http.get("/spares/getAll") 
      .then(function (response) { 
       //success 
       angular.copy(response.data, vm.spareParts); 
      }, function (error) { 
       vm.errorMessage = error; 
      }).finally(function() { 
       vm.isBusy = false; 

      }); 

     vm.addSparePart = function() { 

      vm.isBusy = true; 

      vm.errorMessage = ""; 
      $http.post("/spares", vm.newSparePart) 
       .then(function (response) { 
        console.log("test"); 
        vm.spareParts.push(response.data); 
        vm.newSparePart = {}; 
       }, function() { 
        console.log = "failed to save new spare"; 
        vm.errorMessage = "failed to save new spare"; 
       }).finally(function() { 
        vm.isBusy = false; 

       }); 

     }; 
    } 
})(); 

Index.cshtml Ersatzteile zu zeigen und neue

@model IEnumerable<RnD.Models.ViewModels.SparePartViewModel> 
@{ 
    ViewBag.Title = "Spare Parts List"; 
} 

@section scripts{ 
    <script src="~/lib/angular/angular.js"></script> 
    <script src="~/js/app.js"></script> 
    <script src="~/js/sparePartController.js"></script> 
    <script src="~/js/spareTypeController.js"></script> 
    <script src="~/js/machineController.js"></script> 

} 

<div class="row" ng-app="app" ng-controller="sparePartController as vm"> 
    <!-- Start Modal--> 
    <!-- Button trigger modal --> 
    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal"> 
     Create New Spare Part 
    </button> 
    <!-- Modal --> 
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 
     <div class="modal-dialog" role="document"> 
      <div class="modal-content"> 
       <div class="modal-header"> 
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
        <h4 class="modal-title" id="myModalLabel">Modal title</h4> 
       </div> 
       <div class="modal-body"> 
        <form novalidate name="newSpareForm" ng-submit="vm.addSparePart()"> 
         <div class="form-group"> 
          <label for="InternalCode">Internal Code</label> 
          <input class="form-control" type="text" placeholder="Internal Code" id="InternalCode" ng-model="vm.newSparePart.internalCode" required min="3" /> 
         </div> 
         <div class="form-group" ng-controller="machineController as machineVM"> 
          <label>Machine Type</label> 
          <select class="form-control" ng-model="machineVM.machineType" ng-options="machine.name for machine in machineVM.machines"></select> 
         </div> 
         <div class="form-group" ng-controller="spareTypeController as spareVM"> 
          <label>Spare Type</label> 
          <select class="form-control" ng-model="spareVM.id"> 
           <option ng-repeat="spare in spareVM.spares" value="{{spare.id}}">{{spare.name}}</option> 
          </select> 
         </div> 
         <div class="form-group"> 
          <input type="submit" value="Add" class="btn btn-success" /> 
         </div> 
        </form> 
       </div> 
       <div class="modal-footer"> 
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 

       </div> 
      </div> 
     </div> 
     <!-- End Modal--> 

    </div> 
    <hr /> 
    <div class="panel panel-default" ng-repeat="spare in vm.spareParts"> 
     <div class="panel-heading"> 
      {{spare.internalCode}} //it was vm.internalCode 
     </div> 
     <div class="panel-body"> 

     </div> 
     <div class="panel-footer"> 

     </div> 
    </div> 
</div> 

P. S. hinzufügen Um hinzuzufügen, wenn ich posten möchte, habe ich Probleme, Wert von Auswahl zu fangen. Interner Code wird vom Winkelregler erkannt, aber Maschinentyp wird nicht erkannt, dass das Feld immer Null ist.

hier Model-View-Klasse

public class SparePartViewModel 
    { 
     [Required] 
     [StringLength(100)] 
     public string InternalCode { get; set; } 

     [StringLength(4096)] 
     public string Description { get; set; } 

     [StringLength(255)] 
     public string NameOnFolder { get; set; } 

     public decimal? Enter { get; set; } 

     public decimal? Exit { get; set; } 

     public decimal? Thickness { get; set; } 

     public string Band { get; set; } 

     public string Color { get; set; } 

     public bool Elastic { get; set; } 

     [Required] 
     public MachineType MachineType { get; set; } 

     [Required] 
     public virtual SpareType SpareType { get; set; } 

    } 

ist ich in index.cshtml versuchen sogar <select class="form-control" ng-model="vm.newSparePart.machineType" ng-options="machine.name for machine in machineVM.machines"></select> diesen Code zu setzen, aber in diesem Fall, wenn ich [Von Körper] nennen meine Viewmodel null ist

Hier ist meine SparePartsController .cs

[Route("/spares")] 
    [Authorize] 
    public class SparePartsController : Controller 
    { 
     private ILogger<SparePartsController> _logger; 
     private ISparePartRepository _repository; 

     public SparePartsController(ISparePartRepository repository, ILogger<SparePartsController> logger) 
     { 
      _logger = logger; 
      _repository = repository; 
     } 

     [HttpGet("")] 
     public IActionResult Index() 
     { 
      return View(); 
     } 

     [HttpGet("getAll")] 
     public IActionResult Get() 
     { 
      try 
      { 
       var results = _repository.GetAllSpares(); 

       return Ok(Mapper.Map<IEnumerable<SparePartViewModel>>(results)); 

      } 
      catch (Exception ex) 
      { 
       _logger.LogError($"Failed to get all Spares : {ex}"); 
       return BadRequest("Error Occurred"); 
      } 
     } 

     [HttpPost("")] 
     public async Task<IActionResult> Post([FromBody]SparePartViewModel viewModel) 
     { 
      if (ModelState.IsValid) 
      { 
       var newSpare = Mapper.Map<SparePart>(viewModel); 

       _repository.AddSpare(newSpare); 
       if (await _repository.SaveChangesAsync()) 
       { 
        return Created($"spare/{newSpare.InternalCode}", Mapper.Map<SparePartViewModel>(newSpare)); 
       } 
      } 
      return BadRequest("Failed to save spare."); 
     } 
    } 
+0

Ich aktualisiere meinen Code, ich löse, um Daten zu zeigen. Brauche aber immer noch Hilfe, um das Problem beim Posten zu finden. –

Antwort

0

Ich sehe ein paar Dinge hier. 1. Ich glaube nicht,/Spares ist die vollständige URL der Add-Methode. 2. Auch wenn dies der Fall ist, müssen Sie ihm immer noch eine korrekte Signatur senden - d. H. Die Elemente innerhalb des gesendeten Objekts müssen mit Elementen in der Signatur der Add-Spare-Methode übereinstimmen. 3. Ich sehe nicht, wo Ihrem newSparePart-Objekt Werte zugewiesen werden. es ist nur ein leeres Objekt. Teilen Sie die Methodensignatur für Ihre add reserver-Methode, damit wir das serialisierte Objekt überprüfen können. Welches bringt 4. Sie müssen wahrscheinlich Ihr Objekt zu json: JSON.stringify (vm.newSparePart) serialisieren, wenn Sie es über HTTP-Post senden.

+0

URL ist korrekt. Dein nicht korrektes newSparePart ist kein empty Objekt während des Postings nur am Anfang. Wenn Sie http Promise aufrufen und Daten senden, verlinkt es mit ng-model und sollte mit Werten posten. –

+0

Es sieht so aus, als ob SparePartViewModel Elastic, MachineType und SpareType benötigt. Ich sehe nicht, wo Ihr eckiges Modell mit diesem bevölkert wird ... auch - haben Sie versucht, Ihre Daten zu serialisieren, bevor Sie sie über Ihre Post schicken? – Paurian

+0

Wenn ich auf eine Situation wie diese stoße, vereinfache ich das Problem. Erstellen Sie ein Nebenprojekt mit einem einfachen einfachen "SimpleViewModel", das eine Zeichenfolge "SimpleCode" und nichts sonst hat. Richten Sie Ihre POST-Methode im .NET-Controller und in Ihrem eckigen Service ein. Erstellen Sie einen Winkel-Controller, der ein vorab gefülltes Modell enthält, das an den Dienst gesendet und mit einer einfachen HTML-Schaltfläche gesendet werden soll. Sobald Sie das zum Laufen gebracht haben, fügen Sie Ihrem "SimpleViewModel" eine nicht nullbare "int" -Variable hinzu und fügen Sie Ihrem eckigen Modell den notwendigen Wert hinzu und versuchen Sie es erneut, etc .. Schließlich erhalten Sie einen "Aha" -Moment. – Paurian