ASP.NET ajax GenerateScriptType und eigene Komplexe Typen

Ich beschäftige mich gerade mal etwas intensiver mit dem AJAX-Framework - eigentlich ja schon ein alter Hut. Dabei habe ich ein DotNetNuke-Modul, dass zu einem ASMX-WebService Daten versendet und ein Ergebnis zurück bekommt.

namespace G.Modules.LicCalc
{

  [WebService(Namespace = http://tempuri.org/)] 
  [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  [ScriptService]
  public class CalculatorService : System.Web.Services.WebService
  {

    [WebMethod()]
    public string HelloWorld(LicCalcInfo info)
    {
       return "Hello World" + info.LinuxLicense.ToString();
    }
  }
 
}

Passend dazu gibt es eine Klasse "LicCalcInfo" - die wie DotNetNuke-typische Info-Class aufgebaut ist

using System;

namespace GMS.Modules.LicCalc.Business
{
public class LicCalcInfo
{
private int _windowsLicense;
private int _linuxLicense;

public int LinuxLicense
{
get { return _linuxLicense; }
set { _linuxLicense = value; }
}

public int WindowsLicense
{
get { return _windowsLicense; }
set { _windowsLicense = value; }
}

}
}

Wenn ich jetzt über JavaScript versuche die Methode "HelloWorld" aufzurufen und den Parameter LicCalcInfo übergeben möchte, wird bei der Erstellung der Klasse immer eine JavaScript-Exception ausgelöst. Das JavaScript sah so aus:

function HelloWorld()
{

var info = new LicCalcInfo();
info.LinuxLicense = 10;
DocuSnap.Modules.LicCalc.CalculatorService.HelloWorld(info, SucceededCallback);

}

function SucceededCallback(result, eventArgs)
{
    alert(result);
}

Das ganze funktioniert aber nur, wenn die Klasse "LicCalc" direkt in der ASMX Datei definiert wurde und sich außerhalb des Namespaces befindet. Als extern definierte Klasse habe ich die Einbindung nie geschafft. Die Lösung dabei ist aber mal wieder relativ einfach: Bei der Erzeugung des Objektes in JavaScript muss das Objekt mit dem kompletten Namespace angesprochen werden.. das hat mir dann ein Blick in die automatisch gernierte JavaScript-Datei veraten. Der Aufruf zur Erzeugung muss dann so geschrieben werden:

var info = new DocuSnap.Modules.LicCalc.Business.LicCalcInfo();

Dann kann die Klasse auch in JavaScript erzeugt werden und die Verarbeitung wird erfolgreich durchgeführt.

Kommentar schreiben