Как вернуть объект JSON в стандартные веб-формы .Net
Цель состоит в вызове метода, который делает это, затем возвращает объект JSON.
Я новичок в JSON.
У меня есть default.aspx и в нем следующий код. Теперь я хочу, чтобы обычный метод в Default.aspx.cs запускался на событие click здесь.
$(".day").click(function (event) {
var day = $(event.currentTarget).attr('id');
if (day != "") {
$.ajax(
{
type: "POST",
async: true,
url: 'Default.aspx?day=' + day,
data: day,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
console.log("SUCCESS:" + msg);
// $(".stripp img").attr('src', "data:image/jpg;" + msg);
// $(".stripp").show();
},
error: function (msg) {
console.log("error:" + msg);
}
});
}
});
Default.aspx.cs выглядит примерно так:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["day"] != null)
GetFile(Request.QueryString["day"]);
}
public string GetFile(string day)
{
string json = "";
byte[] bytes = getByteArray();
json = JsonConvert.SerializeObject(bytes);
return json;
}
Где я здесь ошибаюсь?
Должен ли я каким-либо образом использовать это или использовать его только в веб-службах?
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
Ответы
Ответ 1
Я бы предложил HttpHandler
. Нет жизненного цикла страницы (поэтому он быстро растет) и намного более четкое разделение кода, а также возможность повторного использования.
Добавьте новый проект в проект типа "Generic Handler". Это создаст новый .ashx файл. Основным методом любого класса, реализующего IHttpHandler
, является ProcessRequest
. Поэтому, чтобы использовать код из исходного вопроса:
public void ProcessRequest (HttpContext context) {
if(String.IsNullOrEmpty(context.Request["day"]))
{
context.Response.End();
}
string json = "";
byte[] bytes = getByteArray();
json = JsonConvert.SerializeObject(bytes);
context.Response.ContentType = "text/json";
context.Response.Write(json);
}
Измените URL-адрес в своем вызове AJAX, и он должен это сделать. JavaScript будет выглядеть так, где GetFileHandler.ashx - это имя созданного вами IHttpHandler:
$.ajax(
{
type: "POST",
async: true,
url: 'Handlers/GetFileHandler.ashx',
data: "Day=" + $.toJSON(day),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
console.log("SUCCESS:" + msg);
},
error: function (msg) {
console.log("error:" + msg);
}
});
Еще одна небольшая точка для рассмотрения, если вам нужен доступ к объекту Session из самого кода обработчика, убедитесь, что он наследуется от интерфейса IRequiresSessionState
:
public class GetFileHandler : IHttpHandler, IRequiresSessionState
Ответ 2
Да, ваш метод должен быть статичным с атрибутом WebMethod
Основной пример:
CS
using System;
using System.Web.Services;
public partial class _Default : System.Web.UI.Page
{
[WebMethod(EnableSession=false)]
public static string HelloWorld()
{
return "Hello World";
}
}
Javascript
<script>
$.ajax({
type: "POST",
url: "Default.aspx/HelloWorld",
data: "{}",
contentType: "application/json",
dataType: "json",
success: function(msg) {
console.log(msg.d);
}
});
</script>
Ответ 3
Прошло некоторое время с тех пор, как я работал с веб-формами, но если правильно запомнить, он должен работать, если вы поместите атрибут webmethod поверх метода GetFile и сделаете этот метод статическим.
[WebMethod]
public static string GetFile(string day)
Кроме того, как вы отправляете данные в ajax-методе, это бит. Удалите день запроса с url, и данные должны быть в формате json, что-то вроде { "day": day}