2016-04-26 11 views
1

Ich bin neu in Angular JS und stecken für lange Zeit auf ein bestimmtes Problem.Model nicht mit JSON Daten

Für eine UI-Grid-Zeile wäre ein Spaltenwert in linkcelltemplate. Und beim Klicken öffnet sich ein Bootstrap-Modal-Popup mit einem case quick search functionality. Hier

ist das Stück Code:

<div ng-controller="CaseSearchCtrl"> 
    <div ng-show="case.togglePleaseWait"> 
     <div class="refresh" style="padding:15px;width:100%;height:100px;"> 
      <h4>Please wait....</h4> 
     </div> 
    </div> 

    <div class="panel panel-default"> 
     <div class="panel-heading text-center"> 
      Case Search 
     </div> 

     <table class="table table-striped"> 
      <tr> 
       <td> 
        <select name="selSearchType" id="selSearchType" class="form-control" ng-model="case.searchTerm" 
          ng-init="case.searchTerm == 'caseNo'" ng-options="o as o for o in case.searchTerms"></select> 
       </td> 
       <td><input type="text" class="form-control" placeholder="enter search term" ng-model="case.input" /></td> 
       <td><button class="btn btn-default" type="button" ng-click="case.quickSearch()">Quick Search</button></td> 
      </tr> 
     </table>  
    </div> 
</div> 

Und im Texteingabefeld können wir einen Wert eingeben und eine schnelle Suche.

enter image description here

Hier ist mein Controller Stück Code:

TransactionModule.controller("CaseSearchCtrl", ['$scope', '$uibModal', 'TransactionServices', 'CaseServices', 'CaseDataServices', 'TransactionDataServices', function ($scope, $uibModal, TransactionServices, CaseServices, CaseDataServices,TransactionDataServices) { 

    /* Case implementation starts*/ 
    $scope.case = { 

     searchTerm: "caseNo",  
     searchTerms: caseSearchTerms(), 
     toggleQuickSearch: true, 
     togglePleaseWait: false, 
     name: "", 
     number: "", 
     type: "", 
     constName: "", 
     userName: "", 
     status: "", 
    } 

    $scope.case.quickSearch = function() { 
     $scope.case.togglePleaseWait = true; 

     console.log($scope.case.input); 

     if ($scope.case.searchTerm == "caseNo") { 
      $scope.case.number = $scope.case.input; 
     } 
     else if ($scope.case.searchTerm == "caseName") { 
      $scope.case.name = $scope.case.input; 
     } 
     else if ($scope.case.searchTerm == "constituentName") { 
      $scope.case.constName = $scope.case.input; 
     } 
     else if ($scope.case.searchTerm == "userName") { 
      $scope.case.userName = $scope.case.input; 
     } 
     else if ($scope.case.searchTerm == "status") { 
      $scope.case.status = $scope.case.input; 
     } 
     else if ($scope.case.searchTerm == "type") { 
      $scope.case.type = $scope.case.input; 
     } 
     var postParams = [ 
     { 
      "CaseId": $scope.case.number, 
      "CaseName": $scope.case.name, 
      "ReferenceSource" : "", 
      "ReferenceId" : "", 
      "CaseType": $scope.case.type, 
      "CaseStatus": $scope.case.status, 
      "ConstituentName": $scope.case.constName, 
      "UserName": $scope.case.userName, 
      "ReportedDateFrom" : "", 
      "ReportedDateTo" : "", 
      "UserId": $scope.case.userName 
     }] 

     console.log("Post params are"); 

     console.log(postParams); 


     CaseServices.getCaseAdvSearchResults(postParams).then(function (result) { 
      if (result.length > 0) { 
       $scope.case.togglePleaseWait = false; 
       //constMultiDataService.setData(result, HOME_CONSTANTS.QUICK_CASE_SEARCH); 
       console.log("Setting results for Quick search in TransactionDataServices"); 
       console.log(result); 
      } .......................... 

Aber hier ist die CaseInputSearchModel während von der Steuerung zum Web-Service vorbei ist immer NULL. Aber in der Konsole kann ich sehen, dass die Liste übergeben wird.

getCaseAdvSearchResults: function (postCaseSearchParams) { 
    console.log("Before sending to controller"); 
    console.log(postCaseSearchParams); 
    return $http.post(BasePath + "CaseNative/AdvSearch", postCaseSearchParams, { 
     // return $http.post(BasePath + "Home/WriteCaseRecentSearches", postCaseSearchParams, { 
     headers: { 
      "Content-Type": "application/json", 
      "Accept": "application/json" 
     } 
    }).then(function (result) { 
     $http.post(BasePath + "Home/WriteCaseRecentSearches", postCaseSearchParams, { 
      headers: { 
       "Content-Type": "application/json", 
       "Accept": "application/json" 
      } 
     }); 
     console.log(result); 
     return result.data; 
    }); 
}, 

enter image description here

Auch wenn die Parameter richtig in der Konsole angemeldet sind.

enter image description here

Hier ist, wie das Modell, an dem ich die Daten will Aussehen gebunden sein wie:

public class CaseInputSearchModel 
{ 
    public string CaseId { get; set; } 
    public string CaseName { get; set; } 
    public string ReferenceSource { get; set; } 
    public string ReferenceId { get; set; } 
    public string CaseType { get; set; } 
    public string CaseStatus { get; set; } 
    public string ConstituentName { get; set; } 
    public string UserName { get; set; } 
    public string ReportedDateFrom { get; set; } 
    public string ReportedDateTo { get; set; } 
    public string UserId { get; set; } 
} 
+0

Können Sie zeigen, wie Sie die Ergebnisse zurück in das Modell abzubilden? Ich sehe, dass Sie in der Anfrage CamelCase manuell zu PascalCase zuordnen. Vielleicht möchten Sie einfach das JSON.Net CamelCasePropertyNamesContractResolver() verwenden – Martin

+0

Könnten Sie die Registerkarte "Netzwerk" in der Chrome-Konsole öffnen und prüfen, ob die Payload der Postanforderung tatsächlich das enthält, was Sie erwarten? – noppa

Antwort

1

Wenn Sie [FromBody] zu der AdvSearch Methode hinzufügen, behebt das das Problem? Außerdem haben Sie in der AdvSearch ListCaseInputSearchModel als Typ.

AdvSearch([FromBody] CaseInputSearchModel model)

EDIT: gar nicht bemerkt man einen Array sendeten. Versuchen Sie, diese Methode Unterschrift:

AdvSearch([FromBody] IEnuermable<CaseInputSearchModel> model)

+0

Um es nur in eine Liste zu konvertieren, sende ich das json-Array. Sollte es nicht kartiert werden? – StrugglingCoder

+0

Könnten Sie nicht einfach 'IEnumerable ' als Typ haben? – Stephen

+0

Gibt es einen bestimmten Grund, warum List nicht funktioniert? – StrugglingCoder

1

Ur-Modell sollte alle Eigenschaften mit denselben Namen haben wie in postparams json ... dann wird es nur im Controller ... zugeordnet. Besitzt es alle Eigenschaften mit demselben Namen?

+0

Bitte lesen Sie die aktualisierte Frage. Ich habe den Model Code beigefügt. – StrugglingCoder

+0

Versuchen Sie, json.stringify (postCaseSearchParams) zu verwenden, während Sie json an den Controller übergeben. –