#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 пуст, но может каким-то образом получить доступ к его переменным.