2011-01-04 18 views
6

¿Hay alguna manera de cargar el archivo ascx de jQuery?Carga ascx a través de jQuery

ACTUALIZACIÓN:

gracias a @Emmett y @Yads. Estoy usando un controlador con el siguiente código jQuery ajax:

jQuery.ajax({ 
    type: "POST", //GET 
    url: "Foo.ashx", 
    data: '{}', 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (response) 
    { 
     jQuery('#controlload').append(response.d); // or response 
    }, 
    error: function() 
    { 
     jQuery('#controlload').append('error'); 
    } 
}); 

pero me sale un error. ¿Está mi código mal?

Otra actualización: estoy usando

error: function (xhr, ajaxOptions, thrownError) 
{ 
    jQuery('#controlload').append(thrownError); 
} 

y esto es lo que me sale:

no válida JSON:
Prueba => (esta prueba es la etiqueta dentro de mi ascx)

y mi archivo ascx después de Error !!!

Otra actualización:

mi ascx es algo como esto:

<asp:DropDownList ID="ddl" runat="server" AutoPostBack="true"> 
    <asp:ListItem>1</asp:ListItem> 
    <asp:ListItem>2</asp:ListItem> 
</asp:DropDownList> 
<asp:Label ID="Label1" runat="server">Test</asp:Label> 

pero al llamar ajax me sale este error en asp: :(

ctl00_ddl de control' 'de tipo' DropDownList 'debe colocarse dentro de una etiqueta de formulario con runat = servidor.

gracias a @Yads. pero su solución solo funciona con la etiqueta html.

+0

http://stackoverflow.com/questions/1212639/possible-to-load-ascx-with -jquery-load-function – Anders

+0

¿es imposible? ¿Hay alguna forma de convertir el archivo ascx a aspx? o mejor manera? – Raika

+0

la función de error puede tomar un objeto de solicitud, examine request.responseText para averiguar cuál es el error. – Vadim

Respuesta

10

La construcción de la solución de Emmett

public class FooHandler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "text/html"; 
     context.Response.Write(RenderPartialToString("Foo.ascx")); 
    } 

    private string RenderPartialToString(string controlName) 
    { 
     Page page = new Page(); 
     Control control = page.LoadControl(controlName); 
     page.Controls.Add(control); 

     StringWriter writer = new StringWriter(); 
     HttpContext.Current.Server.Execute(page, writer, false); 

     return writer.ToString(); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

utiliza la siguiente solicitud jQuery

jQuery.ajax({ 
    type: "POST", //GET 
    url: "Foo.ashx", 
    dataType: "html", 
    success: function (response) 
    { 
     jQuery('#controlload').append(response); // or response 
    }, 
    error: function() 
    { 
     jQuery('#controlload').append('error'); 
    } 
}); 
+0

¿es este trabajo también en webforms? – Raika

+0

@ Raika Sí solo vete Add-> New Item-> Generic Handler – Vadim

+0

gracias y lo siento ...: D – Raika

1

* Los archivos .ascx se representan en el servidor (dentro de una página * .aspx), no en el lado del cliente (donde se ejecuta JavaScript).

Una opción podría ser crear un * .aspx en blanco, poner el control de usuario en la página * .aspx, y luego obtener esa página a través de jQuery y volcar el resultado en la página.

Editar

Basado en su comentario, tengo otra sugerencia:

Si está desarrollando una aplicación de estilo de CMS, usted debe construir sus controles .ascx * para que sean compatible with the ASP.NET AJAX Toolkit. Eso permitirá a los usuarios agregar contenido a la página sin realizar una actualización completa.

Si realmente quieres hacer las cosas bien para el usuario, deberías consultar Web Parts and ASP.NET AJAX ya que los elementos web fueron realmente diseñados para que los usuarios puedan personalizar el contenido en sus páginas.

+0

estoy desarrollando aplicación web CMS como. Necesito llamar a alguna parte de mi aplicación como archivo ascx. No quiero devolver la página. ¿Hay una mejor manera de hacer eso? No quiero cargar todas las partes también. – Raika

+0

@Raika - Si realmente quiere hacer las cosas bien, hará que su página sea compatible con ASP.NET WebForms AJAX (UpdatePanel, etc.) y que sus controles sean compatibles con eso. Eso te permitiría cargar cosas dinámicamente a través de AJAX. –

+0

gracias. ¿Puede darme más enlaces sobre elementos web o completar el tutorial de elementos web? – Raika

3
public ActionResult Foo() 
{ 
    return new ContentResult 
    { 
     Content = RenderPartialToString("Foo.ascx", null), 
     ContentType = "text/html" 
    }; 
} 

//http://www.klopfenstein.net/lorenz.aspx/render-partial-view-to-string-asp-net-mvc-benchmark 
public static string RenderPartialToString(string controlName, ViewDataDictionary viewData) 
{ 
    ViewPage vp = new ViewPage(); 

    vp.ViewData = viewData; 

    Control control = vp.LoadControl(controlName); 
    vp.Controls.Add(control); 

    StringBuilder sb = new StringBuilder(); 

    using (StringWriter sw = new StringWriter(sb)) 
    { 
     using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
     { 
      vp.RenderControl(tw); 
     } 
    } 

    return sb.ToString(); 
} 
+0

gracias pero estoy usando webforms no mvc !!! :( – Raika

+0

Este es un buen truco – Vadim

+0

Esto es ASP.NET MVC. El OP claramente usa WebForms. –

Cuestiones relacionadas