2012-05-31 4 views
0

J'essaie d'afficher les lignes de jqGrid (4.3.2) et je n'ai pas encore de succès. Ma réponse webservice est:jqGrid ne montre pas les lignes

{"d": 
{"__type":"JSONResponse:pe", 
"ActionType":null, 
"JSONData":" 
      {\"total\":1, 
      \"page\":1, 
      \"records\":5, 
      \"rows\":[ 
         {\"invid\":1,\"cell\":[{\"invid\":1,\"amount\":500,\"tax\":65,\"total\":565,\"note\":\"myNote 0\"}]}, 
         {\"invid\":2,\"cell\":[{\"invid\":2,\"amount\":510,\"tax\":75,\"total\":585,\"note\":\"myNote 1\"}]}, 
         {\"invid\":3,\"cell\":[{\"invid\":3,\"amount\":520,\"tax\":85,\"total\":605,\"note\":\"myNote 2\"}]}, 
         {\"invid\":4,\"cell\":[{\"invid\":4,\"amount\":530,\"tax\":95,\"total\":625,\"note\":\"myNote 3\"}]}, 
         {\"invid\":5,\"cell\":[{\"invid\":5,\"amount\":540,\"tax\":105,\"total\":645,\"note\":\"myNote 4\"}]} 
         ] 
      }", 
"Status":false 
} 

} < - (assumer cette accolades dans le code ci-dessus)

Ma grille de configuration se présentent comme suit: -

<script type="text/javascript"> 
    $(document).ready(function() { 

     gridConfig(); 

    }); 

    function gridConfig() { 
     var request = JSON.stringify(requestData()); 
     var jsonResponse; 

     $("#list").jqGrid({ 
      url: '/ScriptServices/JsonService.svc/Process', 
      ajaxGridOptions: { contentType: 'application/json; charset=utf-8' }, 
      datatype: 'json', 
      postData: { request: function() { return request; } }, 
      mtype: 'GET', 
      colNames: ['Inv No', 'Amount', 'Tax', 'Total', 'Notes'], 
      colModel: [ 
        { name: 'invid', index: 'invid', width: 55 }, 
        { name: 'amount', index: 'amount', width: 80, align: 'right' }, 
        { name: 'tax', index: 'tax', width: 80, align: 'right' }, 
        { name: 'total', index: 'total', width: 80, align: 'right' }, 
        { name: 'note', index: 'note', width: 150, sortable: false } 
        ], 
      pager: $('#pager'), 
      rowNum: 10, 
      rowList: [10, 20, 30], 
      sortname: 'invid', 
      sortorder: 'desc', 
      viewrecords: true, 
      jsonReader: { 
       root: "d.JSONData.rows", 
       page: "d.JSONData.page", 
       total: "d.JSONData.total", 
       records: "d.JSONData.records", 
       cell: "cell", 
       id:0 
      }, 
      caption: 'My first grid' 
     }); 

    }; 

    function requestData() { 
     var request; 
     request = { 
      ActionType: 'GET_GRID_DATA', 
      RequestJSONData: '{ }' 
     }; 
     return request; 
    } 

</script> 

Je ne suis pas en mesure de trouver la problème. Est-ce que tout autre formatage est nécessaire. Aide s'il vous plaît ..

Update1:

Maintenant, mes données sont transmises au bon format JSON après suggestion Oleg, mais à cause de __type champ supplémentaire dans mes données JSON, ce ne est pas rendu correctement.

modifié les données JSON ressemble à: -

{ 
"d": 
    {"__type":"JSONResponse:pe", 
    "ActionType":"GRID_RESP", 
    "JSONData": 
       {"__type":"JQGridJSONReader:pe", 
       "total":1, 
       "page":1, 
       "records":5, 
       "rows":[ 
         {"__type":"InvoiceGrid:pe", 
         "invid":1, 
         "cell":[{"__type":"JqGridCell:pe","invid":1,"amount":500,"tax":65,"total":565,"note":"myNote 0"}]}, 
         .... and More Rows 
         ] 
       }, 
    "Status":true 
} 

} < - (assumer cette accolades dans le code ci-dessus)

J'ai vérifié link et mis en œuvre la suggestion du constructeur par défaut, protected internal n'est pas possible dans mon cas.

Mon service look config comme ceci:

<system.serviceModel> 
    <services> 
     <service name="JsonService" behaviorConfiguration="JsonServiceAspNetAjaxBehavior"> 
      <endpoint address="" behaviorConfiguration="JsonServiceEndPointBehavior" 
       binding="webHttpBinding" contract="JsonService" /> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="JsonServiceEndPointBehavior"> 
       <enableWebScript/> 
       <dataContractSerializer ignoreExtensionDataObject="true" /> 
      </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
      <behavior name="JsonServiceAspNetAjaxBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceDebug includeExceptionDetailInFaults="true" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

Si je demande à <webHttp/>endpointBehaviors I get "Variables pour les valeurs de la requête UriTemplate doivent avoir des types qui peuvent être convertis par 'QueryStringConverter'" erreur.

Mon apparence WebService comme ceci: -

[ServiceContract(Namespace = "http://www.abhishek.com/portal/json")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class JsonService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
    [GenerateScriptType(typeof(JsonService), ScriptTypeId = "JsonService1")] 
    public PresentationEntities.JSONResponse Process(PresentationEntities.JSONRequest request) 
    { 
     JSONResponse response; 

     try 
     { 
      if (request == null) 
      { 
       throw new ArgumentNullException("request", string.Format(ExceptionHelper.ARG_NULL_EXP_MSG, "JSONManager")); 
      } 
      else 
      { 
       JQGridTransalator gridtransalator = new JQGridTransalator(); 
       response = gridtransalator.JQGridToJSONResponse(); // fill response.JSONData with JQGridJSONReader 
      } 
     } 
     catch (Exception) 
     { 
      throw; 
     } 

     return response; 
    }} 

JQGridJSONReader ressembler à ceci: -

[DataContract(Name = "JQGridJSONReader", Namespace = "pe")] 
public class JQGridJSONReader 
{ 
    public JQGridJSONReader() 
    { 

    } 

    [DataMember(Name = "total", Order = 1)] 
    public int Total { get; set; } 

    [DataMember(Name = "page", Order = 2)] 
    public int Page { get; set; } 

    [DataMember(Name = "records", Order = 3)] 
    public int Records { get; set; } 

    [DataMember(Name = "rows", Order = 4)] 
    public List<InvoiceGrid> Rows { get; set; } 
} 

Toute suggestion de supprimer __type des données JSON.

Update2:

Mise à jour du code afin que je puisse répondre à ma question plus clairement

[DataContract(Name = "InvoiceGrid", Namespace = "pe")] 
public class InvoiceGrid 
{ 
    [DataMember(Name = "cell", Order = 2)] 
    public List<JqGridCell> Cell { get; set; } 
} 

[DataContract(Name = "JqGridCell", Namespace = "pe")] 
public class JqGridCell 
{ 
    [DataMember(Name = "invid", Order = 1)] 
    public int Invid { get; set; } 

    [DataMember(Name = "invdate", Order = 2)] 
    public DateTime InvDate { get; set; } 

    [DataMember(Name = "amount", Order = 3)] 
    public double Amount { get; set; } 

    [DataMember(Name = "tax", Order = 4)] 
    public double Tax { get; set; } 

    [DataMember(Name = "total", Order = 5)] 
    public double Total { get; set; } 

    [DataMember(Name = "note", Order = 6)] 
    public string Note { get; set; } 
} 

Répondre

1

Votre erreur est que vous sérialiser l'objet avec des données d.JSONData de l'objet à JSON deux fois. Vous avez probablement utilisé une sérialisation JSON manuellement à la place de l'objet d'utilisation et autorisé .NET à sérialiser les données elles-mêmes.

Comment vous pouvez voir les données comme d.JSONData.rows ne peuvent pas être accessibles, car d.JSONData est chaîne au lieu d'objet ayant rows propriété.

+0

J'ai corrigé mes données json, maintenant c'est bon à venir. mais __type est le champ supplémentaire que je reçois avec les données json qui affectent mon format jsonReader. S'il vous plaît voir le ** Update1 ** – abhishekrvce

+0

J'ai eu l'erreur. L'erreur est dans '" cell ": [{" __ type ":" JqGridCell: pe "," invid ": 1," montant ": 500," taxe ": 65," total ": 565," note ":" myNote 0 "}]},'. bientôt je posterai la réponse. Merci @Oleg pour me donner un indice sur la façon de convertir l'objet .net en objet json. – abhishekrvce

+0

Oui J'utilisais la sérialisation JSON manuellement. Corrigé cela. Peut être à l'avenir je ne ferai jamais cela parce que ASP.NET déjà pour moi lors de l'envoi de la réponse. :) – abhishekrvce

0

Première erreur corrigée: - Comme suggéré par @Oleg j'ai converti JSONData (était en format chaîne) en objet json. Cela était dû à la sérialisation JSON utilisée avant l'envoi des données.

Deuxième erreur corrigée: -

Mon type de cellule était comme ça: List<GridData> et gridData avait le contenu cellulaire (qui est de type complexe à savoir GridData). Donc, je recevais ceci

"cell":[{"__type":"JqGridCell:pe","invid":1,"amount":500,"tax":65,"total":565,"n‌​ote":"myNote 0"}]}, Dans cette cellule est d'avoir un type complexe comme première rangée. Imaginez comme "cell":[{ComplexType}] Donc, je recevais "[objet objet]" dans ma première cellule et d'autres cellules restent vides.

Ainsi le type de cellule corrigé comme List<string> a ajouté des données de grille à celui-ci, puis a ajouté la cellule à List<InvoiceGrid>.

 JQGridJSONReader input = new JQGridJSONReader(); 
     input.Page = 1; 
     input.Total = 1; 
     input.Records = 5; 

     input.Rows = new List<InvoiceGrid>(); 


     for (int i = 0; i < 5; i++) 
     { 
      InvoiceGrid invGrid = new InvoiceGrid(); 
      invGrid.Cell = new List<string>(); 
      JqGridCell gridrows = new JqGridCell(); 
      gridrows.Invid = 1 + i; 
      gridrows.Amount = 500.00 + (i * 10); 
      gridrows.Tax = 65.00 + (i * 10); 
      gridrows.Total = gridrows.Amount + gridrows.Tax; 
      gridrows.Note = "myNote " + i.ToString(); 
      invGrid.Cell.Add(gridrows.Invid.ToString()); 
      invGrid.Cell.Add(gridrows.InvDate.ToString()); 
      invGrid.Cell.Add(gridrows.Amount.ToString()); 
      invGrid.Cell.Add(gridrows.Tax.ToString()); 
      invGrid.Cell.Add(gridrows.Total.ToString()); 
      invGrid.Cell.Add(gridrows.Note.ToString()); 
      input.Rows.Add(invGrid); 
     } 

Je pensais que l'erreur est en raison de __type que les données JSON supplémentaires. Mais il semble que jqGrid ignore cela.

Mes données json ressemblent maintenant à ceci. Note: - J'ai ignoré cette fois mais peut être inclus.

{"d": 
{"__type":"JSONResponse:pe", 
"ActionType":"GRID_RESP", 
"JSONData": 
      {"__type":"JQGridJSONReader:pe", 
      "total":1, 
      "page":1, 
      "records":5, 
      "rows":[ 
        {"__type":"InvoiceGrid:pe", 
        "cell":["1","500","65","565","myNote 0"]}, 
        {"__type":"InvoiceGrid:pe", 
        "cell":["2","510","75","585","myNote 1"]}, 
        {"__type":"InvoiceGrid:pe", 
        "cell":["3","520","85","605","myNote 2"]}, 
        {"__type":"InvoiceGrid:pe", 
        "cell":["4","530","95","625","myNote 3"]}, 
        {"__type":"InvoiceGrid:pe", 
        "cell":["5","540","105","645","myNote 4"]} 
        ] 
      }, 
"Status":true 
}} 

Merci beaucoup @Oleg.