Jak poslat data na ASP.NET Handler

Jelikož jsem nad tím strávil notnou dávku času (…), tak to tu dávám, snad to někomu bude prospěšné. Každopádně, radím vám dobře, vykašlete se na všechny objekty XMLHttpRequest, ActiveXObjects(které fungují pouze v IE) nebo jiné frameworky určené přímo k tomuto, např. já jsem našel XHConn.

Jediné co k tomu potřebujete je jQuery. Já jsem použil verzi 1.4.1, kterou máte pokud používáte VS 2010 již v šabloně. Nakonec jsem vybral 2 metody, které 100% fungují ve všech 4rech nejpoužívanějších prohlížečích(a funguje to i na localhostu, někde jsem četl že chrome toto na localhostu neumí, tak jsem to kopíroval na hosting ale teď vidím – byl jsem naivní a hloupý že jsem tomu věřil), zkoušel jsem to na těchto prohlížečích: Google Chrome 17.0.963.56 m, Opera 11.61, Mozilla Firefox 10.0.1 a IE 8(jak jsem psal už dříve, nemám rád IE9 protože ten je podle mě ještě větší *vina než IE8).

A teď ke samotnému kódu, xml jsem nezkoušel ale JSON funguje bezvadně ve všech:
Jednodušší varianta bez parametrů – metoda post:

JS
function posli7() {
    $.post('SayHello.ashx', {
            'tab': 'opera',
            'rat': '7'
        }, function () {
            //libovolny kod co chcete udelat pokud se operace zdari
        });
}

A složitější varianta s parametry – metoda ajax:

CODE
function posli9()
{
$.ajax  ({
type: "GET",
url: 'SayHello.ashx',
data: { 'tab': 'opera', 'rat': '9' }, //"rat=9&tab=L" - jako data můžete zadat QueryString nebo json při zachování všeho ostatního - funguje všechno
contentType: "application/json; charset=utf-8",
dataType: "json",
async: false, //To je asi důležité pro chrome, který nezvládá asynchronní operace, taky jsem o tom četl ale nezkoušel
success: function (response)
{ //Libovolny kod co se ma delat po uspechu
}
//error: branchAjaxFailed //-Muzete si vypsat i libovolny kod co delat v pripade chyby
});

}

Jako metodu success můžete zadat null, stejně se s těmi daty asi nedá nic dělat – zřejmě chyba v paremetru/metodě success. Musíte volat pro získání dat metodu get(viz níže).

Takže metoda se nedá využít i když chcete získat data z handleru. Jinak metoda branchAjaxFailed může vypadat nějak takto kdybyste ji chtěli:

JS
function branchAjaxFailed(result)
{
    alert("FAILED : " + result.status + ' ' + result.statusText);

}

(to číslo za „posli“ je pořadové číslo metody – volal jsem je všechny najednou a zkoušel. #justsayin).

A teď ještě kód ASHX handleru:

XML
<%@ WebHandler Language="C#" Class="SayHello" %>
using System; using System.Web; public class SayHello: IHttpHandler { public void ProcessRequest(HttpContext context) { string param = context.Request.Params[ & quot; rat & quot;]; //-Je velice uzitecne ze vam to vraci primo stringy a ne objekty, ktere byste museli kontrolovat na null a pak je prevadet na ToString() string param2 = context.Request.Params[ & quot; tab & quot;]; //-Kdyz nejaky parametr nebude nalezen, web nebo kod samozrejme nezhavaruje ale promenna bude jen null string param3 = context.Request.Params[ & quot; tab2 & quot;]; if (param != null & amp; & amp; param2 != null) { string soubor = System.Web.Hosting.HostingEnvironment.MapPath( & quot; ~/a.txt"); System.IO.File.AppendAllText(soubor, param + & quot; & quot; + param2 + Environment.NewLine); } } public bool IsReusable { get { return false; } } }

A jak vidíte, handler zapisoval na disk obsahy parametrů rat a tab. Výsledek(když jsem před každým browserem měnil parametr tab v JS) je takový:

7 ie
9 ie
7 chrome
9 chrome
7 firefox
9 firefox
7 opera
9 opera

Pokoušel jsem se i získat z handleru data metodou .ajax ale ať jsem volal metodu prompt nebo alert, tak se mi nic nezobrazilo. Proto pokud chcete získat data, musíte volat metodu .get a parametry předat v querystringu:

JS
function ziskej1()
{
    $.get('SayHello.ashx?id=1', function (data)
        {
            $('#result').html(data);
        });

}

Pokud potřebujete získat více parametrů, musíte si je jednoduše vyparsovat z parametru data.

Pokud voláte metodu get, musíte v handleru zapisovat například metodou context.Response.Write(zde vracím ten querystring parametr který jsem mu předal – funguje):

C#
context.Response.Write(context.Request.QueryString["id"]);

Objevil jsem i na netu příklady volání webových služeb, ale já jsem si to rozdělil – webové služby(asmx) budu používat pro spolupráci webu a desktopových aplikací.

Handlery(ashx) naopak když stránka bude potřebovat něco po serveru bez reloadu/postbacku.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *