2010-06-01 9 views
40

J'essaie de passer JSON de jQuery à un fichier .ASHX. Exemple de jQuery ci-dessous:ASP.NET - Passage de JSON de jQuery à ASHX

$.ajax({ 
     type: "POST", 
     url: "/test.ashx", 
     data: "{'file':'dave', 'type':'ward'}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json",  
    }); 

Comment puis-je récupérer les données JSON dans mon fichier .ashx? J'ai la méthode:

public void ProcessRequest(HttpContext context) 

mais je ne trouve pas les valeurs JSON dans la demande.

+0

l'échantillon va vous aider à http://stackoverflow.com/a/19824240/1153856 – OsmZnn

Répondre

-3

Essayez System.Web.Script.Serialization.JavaScriptSerializer

Avec coulée au dictionnaire

+2

Merci pour la réponse. Pourriez-vous élaborer un peu s'il vous plaît? Quel objet devrais-je sérialiser? –

+0

@colin, je préfère Dictionnaire, mais vous pouvez persister tout objet, par exemple dans votre exemple: class MyObj {public String file, type; } – Dewfy

4

Si vous envoyez des données au serveur en ce qui concerne des $.ajax les données ne seront pas converties en données JSON automatiquement (voir How do I build a JSON object to send to an AJAX WebService?). Donc, vous pouvez utiliser contentType: "application/json; charset=utf-8" et dataType: "json" et rester ne pas convertir les données avec JSON.stringify ou $.toJSON. Au lieu de

data: "{'file':'dave', 'type':'ward'}" 

(manuel conversion des données en JSON) vous pouvez utiliser

data: {file:'dave', type:'ward'} 

et obtenir les données du côté serveur avec context.Request.QueryString["file"] et context.Request.QueryString["type"] constructions. Si vous recevez des problèmes avec cette façon, vous pourriez essayer avec

data: {file:JSON.stringify(fileValue), type:JSON.stringify(typeValue)} 

et l'utilisation DataContractJsonSerializer du côté du serveur.

+0

Merci pour la réponse. Le problème que j'ai est juste que je ne peux pas obtenir les données JSON dans l'objet de demande lors de l'utilisation d'une page ASHX. La valeur de context.Request.QueryString ["file"] est toujours nulle. Savez-vous comment obtenir les données JSON dans la demande? –

+0

Pour pouvoir voir le paramètre 'file' avec' context.Request.QueryString ["file"] 'vous devriez utiliser' data' comme 'data: {file: 'dave', tapez: 'ward'}' (voir mon répondre). Ensuite, les paramètres de requête avec les noms 'fichier' et' type' seront définis et les données postées sur le serveur seront encodées comme 'file = dave? Type = ward'. – Oleg

+2

Si votre AJAX est POSTing, les données seront dans la propriété Request.Form, pas QueryString. –

-1

si vous utilisez .ajax $ et en utilisant .ashx pour obtenir querystring, ne pas mettre datatype

$.ajax({ 
    type: "POST", 
    url: "/test.ashx", 
    data: {'file':'dave', 'type':'ward'}, 
    **//contentType: "application/json; charset=utf-8", 
    //dataType: "json"**  
}); 

i get it travail!

1

Cela fonctionne pour appeler des services Web. Pas sûr .ashx

$.ajax({ 
    type: "POST", 
    url: "/test.asmx/SomeWebMethodName", 
    data: {'file':'dave', 'type':'ward'}, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
     $('#Status').html(msg.d); 
    }, 
    error: function(xhr, status, error) { 
     var err = eval("(" + xhr.responseText + ")"); 
     alert('Error: ' + err.Message); 
    } 
}); 



[WebMethod] 
public string SomeWebMethodName(string file, string type) 
{ 
    // do something 
    return "some status message"; 
} 
0

vous devez défini les propriétés du gestionnaire dans le fichier de configuration Web pour gérer l'extension définis par l'utilisateur formats de demande. Ici, l'utilisateur extension définie est ".api"

ajouter verbe = "*" path = type "test.api" = "test" remplacer l'url : "/test.ashx" à url: "/test.api".

23

La solution suivante a fonctionné pour moi:

côté client:

 $.ajax({ 
      type: "POST", 
      url: "handler.ashx", 
      data: { firstName: 'stack', lastName: 'overflow' }, 
      // DO NOT SET CONTENT TYPE to json 
      // contentType: "application/json; charset=utf-8", 
      // DataType needs to stay, otherwise the response object 
      // will be treated as a single string 
      dataType: "json", 
      success: function (response) { 
       alert(response.d); 
      } 
     }); 
Side

Server.ashx

using System; 
    using System.Web; 
    using Newtonsoft.Json; 

    public class Handler : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      context.Response.ContentType = "text/plain"; 

      string myName = context.Request.Form["firstName"]; 

      // simulate Microsoft XSS protection 
      var wrapper = new { d = myName }; 
      context.Response.Write(JsonConvert.SerializeObject(wrapper)); 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 
+0

Cela n'a pas fonctionné pour moi comme ceci, mais plutôt: 'string myName = context.Request [" firstName "]'; – Jaanus

+0

@Jaanus Utilisez-vous POST? – Andre

+0

@Andre puis-je obtenir le {firstName: 'stack', lastName: 'overflow'} Chaîne complète. Je n'ai pas besoin de me séparer. S'il vous plaît donner une solution http://stackoverflow.com/questions/24732952/receive-the-jsonquery-string-in-webmethod?noredirect=1#comment38367134_24732952 – Sagotharan

49

Je sais que cela est trop vieux, mais juste pour le disque que je voudrais ajouter mes 5 cents

Vous pouvez lire l'objet JSON sur le serveur avec cette

string json = new StreamReader(context.Request.InputStream).ReadToEnd(); 
+0

Ceci est la bonne façon de le faire fonctionner. Parfait. –

+0

c'est le plus important 5 cents. Je voudrais ajouter à cela si cela ne vous dérange pas. – naveen

+0

@Claudio Redi S'il vous plaît aidez-moi à résoudre ce problème ... http://stackoverflow.com/questions/24732952/receive-the-jsonquery-string-in-webmethod?noredirect=1#comment38367134_24732952 – Sagotharan

2
html 
<input id="getReport" type="button" value="Save report" /> 

js 
(function($) { 
    $(document).ready(function() { 
     $('#getReport').click(function(e) { 
      e.preventDefault(); 
      window.location = 'pathtohandler/reporthandler.ashx?from={0}&to={1}'.f('01.01.0001', '30.30.3030'); 
     }); 
    }); 

    // string format, like C# 
    String.prototype.format = String.prototype.f = function() { 
     var str = this; 
     for (var i = 0; i < arguments.length; i++) { 
      var reg = new RegExp('\\{' + i + '\\}', 'gm'); 
      str = str.replace(reg, arguments[i]); 
     } 
     return str; 
    }; 
})(jQuery); 

c# 
public class ReportHandler : IHttpHandler 
{ 
    private const string ReportTemplateName = "report_template.xlsx"; 
    private const string ReportName = "report.xlsx"; 

    public void ProcessRequest(HttpContext context) 
    { 
     using (var slDocument = new SLDocument(string.Format("{0}/{1}", HttpContext.Current.Server.MapPath("~"), ReportTemplateName))) 
     { 
      context.Response.Clear(); 
      context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
      context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", ReportName)); 

      try 
      { 
       DateTime from; 
       if (!DateTime.TryParse(context.Request.Params["from"], out from)) 
        throw new Exception(); 

       DateTime to; 
       if (!DateTime.TryParse(context.Request.Params["to"], out to)) 
        throw new Exception(); 

       ReportService.FillReport(slDocument, from, to); 

       slDocument.SaveAs(context.Response.OutputStream); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(ex.Message); 
      } 
      finally 
      { 
       context.Response.End(); 
      } 
     } 
    } 

    public bool IsReusable { get { return false; } } 
} 
Questions connexes