none
Jak pracovat s komplexním typem uvnitř IScriptControl v clientském kódu?

    Dotaz

  • Mám C# objekt s názvem Author obsahující automatické vlastnosti jako FirstName, LastName, CountryId a "dopočítávanou" vlastnost Name (LastName + ", " + FirstName)

    Pak mám vytvořený javascriptový objekt motodou prototype s názvem Author, obsahující stejné proměnné. Pro každou vlastnost kromě dopočítávaného Name má vytvořené funkce get_ a set_

    Kod zde:

     

    Web.Admin.Controls.Author = function
     () { 
    this .Id; this .FirstName; this .LastName; this .CountryId; } Web.Admin.Controls.Author.prototype = { get_Id: function () {
    return this .Id;
    }, set_Id: function (value) {
    this .Id = value;
    }, get_FirstName: function () {
    return
    this .FirstName;
    }, set_FirstName: function (value) {
    this .FirstName = value;
    }, get_LastName: function () {
    return this .LastName;
    }, set_LastName: function (value) {
    this .LastName = value;
    }, get_CountryId: function () {
    return this .CountryId;
    }, set_CountryId: function (value) {
    this .CountryId = value;
    }, get_Name: function () {
    return this .LastName + ', ' + this .FirstName;
    } } Web.Admin.Controls.Author.registerClass('Web.Admin.Controls.Author' , Object);

     


    Dále mám UserControl (ascx) implementující IScriptControl, ICallbackEventHandler a IPostbackEventHandler, která obsahuje bindovatelnou vlastnost AuthorCollection – kolekci autorů (ICollection<Author>), která je zaregistrována ScriptControlDescriptorem metodou AddProperty pro použití v klientskam kódu.

     

    Otazka 1: Jak docílit, aby se C# objekty typu Author z vlastnosti AuthorCollection serializovaly do javascriptového objektu Author?

     

    Otazka2: Jak postupovat v případě, že kontrolky pracující s objektem Author budou na jedné stránce dvě či více. (Zajistit aby javascriptová třída Author byla zaregistrována jen 1x pro používání v obou UserControlkách) (vyřešit vyjimku: „Sys.InvalidOperationException: Type <TypeName> has already been registered. The type may be defined multiple times or the script file that defines it may have already been loaded. A possible cause is a change of settings during a partial update. “)?

     

    Děkuji za případné odpovědi,

    Petr Ciml.

    pondělí 27. prosince 2010 9:32

Odpovědi

  • ad 1) Musíte nějakým způsobe ty data na klienta dostat a záleží především na scénáři, jestli je tam budete posílat v JS už při prvním requestu na stránku nebo dodatečně, např. přes AJAX volání webové služby (via JSON), atp.

     

    ad 2) JScript, který vytváří prototyp třídy a registruje ho musíte ošetřit tak, aby se celý do stránky vyemitoval pouze jedenkrát, nejenom aby se pouze jednou regidtrovalo. Emitujte JScript pomocí code-behind metody ScriptManager.RegisterClientScriptBlock() , popř. ClientScript.RegisterClientScript() a s podmínkou ClientScript.IsClientScriptBlockRegistered().

    http://msdn.microsoft.com/en-us/library/bb350750.aspx

    http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.aspx


    Robert Haken, Microsoft MVP ASP/ASP.NET, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz
    úterý 29. března 2011 20:35
    Moderátor