2009-01-08 17 views
9

Tengo un control de servidor ASP.NET que confía en JQuery para cierta funcionalidad. Intenté agregar como un recurso web.Uso de JQuery como fuente web incorporada de ASP.NET

Mi problema es mi método de incluir el archivo de jQuery añade al cuerpo, o la forma para ser exactos:

this.Page.ClientScript.RegisterClientScriptInclude(...) 

La alternativa a esto es agregar como un literal en la etiqueta de la cabeza:

LiteralControl include = new LiteralControl(jslink); 
this.Page.Header.Controls.Add(include); 

el problema con esto es sin embargo ningún SRC código existente en la cabeza que usar jQuery fallar, como jQuery se carga después (ASP.NET agrega el literal en la parte inferior del árbol de control).

¿Existe alguna forma práctica de hacer de JQuery un recurso incrustado, pero cargado en la cabeza primero? O debería darme por vencido ahora.

+0

¿Puedo preguntar por qué no solo está agregando el archivo jquery a su proyecto y haciendo referencia a él con una etiqueta de script? – d4nt

+0

Se puede hacer así y por el momento, pero la idea es que el control del servidor sea autocontenido –

Respuesta

1

Actualización:

Una manera mucho más fácil de hacerlo es simplemente agregar la etiqueta script de forma dinámica, en la secuencia de comandos y el punto al código de Google de alojamiento. p.ej.

function include_dom(script_filename) { 
    var html_doc = document.getElementsByTagName('head').item(0); 
    var js = document.createElement('script'); 
    js.setAttribute('language', 'javascript'); 
    js.setAttribute('type', 'text/javascript'); 
    js.setAttribute('src', script_filename); 
    html_doc.appendChild(js); 
    return false; 
} 

include_dom("http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"); 

La función se toma de this article


Crecentfresh me empujó en la dirección correcta, también he encontrado

http://en.csharp-online.net/Creating_Custom_ASP.NET_AJAX_Client_Controls—IScriptControl.GetScriptReferences_Method.

Mi problema sigue siendo sin embargo, el ScriptManager agrega las referencias después del script en la cabeza, pero creo que este es un problema que no se puede resolver.He optado por contestarme a mí mismo, pero también he votado a favor de crescentfresh.

7

Si desea empaquetar jQuery e incrustarlo dentro de su propio control de servidor, debe servirlo al cliente utilizando el ScriptManager. Desde lo alto de la cabeza que tiene que:

  1. añadir jquery.js a su proyecto
  2. bajo su "Acción de generación" Propiedad, lo convierten en un recurso incrustado
  3. en los AssemblyInfo.cs para el control de añadir

    [assembly: WebResource("<Your Server Control namespace>.jQuery.js", "application/x-javascript")] 
    
  4. hace que su control heredar de System.Web.UI.ScriptControl (o al menos poner en práctica IScriptControl)

  5. GetScriptReferences anular:

    protected override IEnumerable<ScriptReference> 
    GetScriptReferences() 
    { 
    return new ScriptReference[] { 
        new ScriptReference("<Your Server Control namespace>.jQuery.js", this.GetType().Assembly.FullName), 
    }; 
    } 
    

Todos los de su propio script de cliente debe ser configurado en el interior:

protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors() 

que a su vez garantizar el orden correcto de las dependencias (es decir, jQuery estará disponible para su propio script de cliente).

+0

Ah, y probablemente debería usar jQuery noConflict() y exponerlo dentro de su propio espacio de nombres del lado del cliente. IE MyNameSpace. $ = JQuery.noConflict() Para no interferir con otros usos de $ la página externa podría estar haciendo. –

+0

Tengo que intentar eso, hemos tenido el mismo problema. – mbillard

+0

Esto me ha empujado en la dirección correcta, también he encontrado http://en.csharp-online.net/Creating_Custom_ASP.NET_AJAX_Client_Controls-IScriptControl.GetScriptReferences_Method. Mi problema sigue siendo sin embargo, el ScriptManager agrega las referencias después de la secuencia de comandos en la cabeza . –

Cuestiones relacionadas