Pregunta

Necesito la salida XML / ASX en una página ASPX. El XML se genera a partir del código detrás y voluntad aspecto que presentan .

Estoy usando constructor de cadena para crear el XML / ASX.

            (...)
            sb.AppendLine("<asx version='3.0'>");
            sb.AppendLine("<title> Spilliste </title>");
            while (i < pdc.Count)
            {
                sb.AppendLine("<entry>");
                sb.AppendLine("<title>" + pdc[i].PageName + "</title>");
                sb.AppendLine("<abstract> Ikke tilgjengelig</abstract>");
                sb.AppendLine("<ref>" + pdc[i].LinkURL + "</ref>");
                sb.AppendLine("</entry>");
                i++;
            }
            sb.AppendLine("</asx>");

            return sb.ToString();
            (...)

Pero, ¿cómo puede dar salida que esto?

Response.Write no funciona desde detrás de código. Y estoy notable a utilizar <asp:label> en el archivo ASPX, ya que tiene que ser colocado dentro de las etiquetas. Tengo básicamente una página en blanco ASPX.

¿Qué hacer?

¿Fue útil?

Solución

No utilice un Page para esto. Básicamente son Pages de representación HTML. Si desea enviar xml o imágenes o cualquier otro tipo de datos para el caso se debe utilizar un archivo de .ashx yy una clase que implemente IHttpHandler .

Se puede ver en este ejemplo cómo implementar la interfaz.

Otros consejos

Response.Write debería funcionar de código detrás:

  Response.Write("some test");
  Response.Flush();

Pero usted debe ejecutar el código en el método Load. Debe preparar aspx separado para la generación y xml usuario redirección esa página. Esta página debe estar vacía (sólo <%@ ... %> en el archivo aspx).

Se debe utilizar un IHttpHandler para esto - se puede configurar qué URL es que maneja o bien por hacer una .ashx archivo (muy simple) o por registrarlas en el web.config archivo, que es más flexible, pero más complicado ya que la sintaxis diferentes entre el modo clásico e integrado de IIS .

A continuación, tendrá una clase simple con un miembro importante - un método ProcessRequest teniendo sólo un parámetro -. El HttpContext

Además, evitar el uso de un StringBuilder para construir XML. Se puede utilizar el LINQ más seguro y más flexible a las clases XML en lugar: El uso de este enfoque de tipo seguro también hace que sea manera más fáciles de métodos auxiliares de escritura para generar las partes del árbol XML correctamente; y se puede consultar y transformar los resultados de arranque.

void ProcessRequest(HttpContext context) {
    var pdc = Enumerable.Range(0,10).Select(
        i=>new{PageName="Page"+i,LinkURL="Link"+i});                

    var xmlString = 
    new XElement("asx",
        new XAttribute("version","3.0"),
        new XElement("title","Spilliste"),
        pdc.Select(pdcElem=>
            new XElement("entry",
                new XElement("title",pdcElem.PageName),
                new XElement("abstract","Ikke tilgjengelig"),
                new XElement("ref",pdcElem.LinkURL)
            )
        )
    ).ToString(SaveOptions.DisableFormatting);

    //don't forget to handle headers and set things like content-type too!
    context.Response.Write(xmlString);
}

La razón de este enfoque es mejor que la piratería en torno a un archivo .aspx es que aunque es posible en un archivo .aspx, que necesita para luchar contra el marco para llegar allí - un montón de infraestructura en su camino, quizá mangling sutilmente la salida antes de que llegue el cliente. La forma más fácil de deshacerse de que es mediante el uso de un controlador de más-desnuda-al-metal que no está destinado específicamente a los controles aspx anfitrionas y generar HTML.

    Response.ClearHeaders();
    Response.ContentType = "text/xml;charset=UTF-8";
    string xmlString = "<aaa>sai</aaa>";
    Response.Write(xmlString);
    Response.End();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top