Печать json с помощью C # asp.net

#c# #asp.net #ajax #json #themes

#c# #asp.net #ajax #json #темы

Вопрос:

Хорошо, итак, у меня есть некоторый код jQuery, который отправит AJAX-запрос в aspx-файл.

Мой файл проверки орфографии.aspx выглядит следующим образом:

 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Spellchecker.aspx.cs" Inherits="Spellchecker" %>
<head id="Head1" runat="server" />
  

Мне пришлось поместить этот тег «head», иначе я получаю ошибку относительно «<тема страницы» в файле web.config (который мне нужен для других страниц сайта). Это означает, что ответ от сервера приходит в форме: <JSON HERE><head … /> что неверно, потому что код должен просто возвращать данные json.

В файле aspx.cs я возвращаю словарь, преобразованный в json в Page_Load:

 dict.Add("just_json", json_obj);
JavaScriptSerializer serializer = new JavaScriptSerializer(); //creating serializer instance of JavaScriptSerializer class
string json = serializer.Serialize((object)dict);

Response.Write(json);
}
  

Итак, в окне предупреждения я вижу данные json, за которыми следуют <идентификатор заголовка =»Head1″><ссылка href …» Таблицы стилей и т.д.

Как я могу сделать так, чтобы из aspx возвращались только данные JSON?

ОБНОВЛЕНИЕ: Я думаю, что я понял это. Добавление Theme=»» в тег «% Page» в aspx-файле, похоже, отключает тему!

Ответ №1:

Чтобы ответить на ваш актуальный вопрос «зачем мне нужен элемент head» — потому что именно здесь ASP.NET помещает ваши ссылки на CSS и некоторый импорт JavaScript.

Неясно, что именно вы пытаетесь здесь сделать, но, похоже, вы, вероятно, хотите создать веб-сервис или предоставить метод в виде ScriptMethod. Странно использовать страницу ASPX с целью вывода ответа на запрос AJAX.

Посмотрите на ScriptMethod или HttpHandlers.

HttpHandlers позволяют вам полностью управлять ответом. Итак, вы бы создали обработчик и подключили его к «SpellChecker.ashx», и обработчик мог бы записывать данные непосредственно в поток ответов.

 public class SpellCheckerHttpHandler : IHttpHandler
{
    public bool IsReusable { get { return true; } }

    public void ProcessRequest(HttpContext context)
    {
        //Write out the JSON you want to return.
        string json = GetTheJson();

        context.Response.ContentType = "application/json";
        context.Response.Write(json);
    }
}
  

И затем в вашем Web.Config внутри элемента system.webServer добавьте:

 <handlers>
    <add name="SpellChecker" path="~/SpellChecker.ashx" type="MyNamespace.HttpHandlers.SpellCheckerHttpHandler, MyAssembly" />
</handlers>
  

Теперь вы можете отправить запрос своему обработчику следующим образом http://localhost/SpellChecker.ashx?TextToCheck=xyz .

Комментарии:

1. Оба этих варианта выглядят слишком сложными для простого вывода некоторого json. Ответ. Запись работает нормально, почему я не должен ее использовать? Я бы предпочел не писать 30 строк только для того, чтобы запустить веб-сервис. Пример обработчика немного расплывчатый, но я определенно собираюсь протестировать этот метод.

2. Метод HttpHandler на самом деле действительно прост. Я дополню свой ответ кратким примером.

3. Да, кажется, это работает хорошо. Однако я не могу решить проблему. Я получаю это, когда ввожу URL-адрес в своем браузере: {«id»: 1, «json»:[5,10,15,20],»0″:»99″} ( мои данные json), однако по какой-то причине javascript получает ответ как объект json, так и json. длина «не определена» в javascript, но она может получить доступ к json[0] и вернет 99 в окне предупреждения. Есть идеи? Или мне следует создать отдельную тему, поскольку мы, похоже, углубляемся в особенности javascript / jquery.

4. Я бы выделил отдельную тему для проблемы JS, поскольку это вроде как связано, но не совсем. Рад, что смог помочь.

Ответ №2:

Если все, что делает ваша страница, это обрабатывает ввод и вывод JSON, рассмотрите возможность использования страницы «Общего обработчика», которая заканчивается на ashx, вместо «веб-страницы», которая заканчивается на asmx. В нем намного меньше перегрузок, и он не будет пытаться загружать темы и т.д.

Вы можете заставить его выводить JSON вместо XML или что-то еще, управляя типом содержимого вывода:

 context.Response.ContentType = "application/json";
  

Комментарии:

1. Да, это именно то, что я сделал. Теперь я думаю, что у меня возникают проблемы с javascript, поскольку jquery считает, что возвращаемый объект json пуст, но может каким-то образом получить доступ к его переменным.