ASP.NET – 从JQuery传递JSON到ASHX
我试图从JQuery传递JSON到.ASHX文件。 下面的jQuery示例:
$.ajax({ type: "POST", url: "/test.ashx", data: "{'file':'dave', 'type':'ward'}", contentType: "application/json; charset=utf-8", dataType: "json", });
如何检索我的.ASHX文件中的JSON数据? 我有方法:
public void ProcessRequest(HttpContext context)
但是我找不到请求中的JSON值。
我知道这太旧了,但是为了logging,我想加5分钱
你可以用这个读取服务器上的JSON对象
string json = new StreamReader(context.Request.InputStream).ReadToEnd();
以下解决scheme为我工作:
客户端:
$.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); } });
服务器端.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; } } }
如果您向$.ajax
发送数据到服务器,则数据将不会自动转换为JSON数据(请参阅如何构build发送到AJAX WebService的JSON对象? )。 因此,您可以使用contentType: "application/json; charset=utf-8"
和dataType: "json"
并保持不使用JSON.stringify
或$.toJSON
转换数据。 代替
data: "{'file':'dave', 'type':'ward'}"
(手动将数据转换为JSON),您可以尝试使用
data: {file:'dave', type:'ward'}
并使用context.Request.QueryString["file"]
和context.Request.QueryString["type"]
构造获取服务器端的数据。 如果你确实收到了这样的问题,那么你可以尝试一下
data: {file:JSON.stringify(fileValue), type:JSON.stringify(typeValue)}
并在服务器端使用DataContractJsonSerializer
。
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; } } }
这适用于调用Web服务。 不确定.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"; }
您必须在Webconfiguration文件中定义处理程序属性来处理用户定义的扩展请求格式。 这里用户定义的扩展名是“ .api”
将verb =“*”path =“test.api”type =“test”replace为url:“/test.ashx”到url:“/test.api” 。
如果使用$ .ajax并使用.ashx来获取查询string,则不设置数据types
$.ajax({ type: "POST", url: "/test.ashx", data: {'file':'dave', 'type':'ward'}, **//contentType: "application/json; charset=utf-8", //dataType: "json"** });
我得到它的工作!
尝试System.Web.Script.Serialization.JavaScriptSerializer
铸造到字典