Cómo usar ASP.NET o Visual Basic .NET para transformar XML en formato de texto enriquecido para Microsoft Word 2002

Seleccione idioma Seleccione idioma
Id. de artículo: 311461 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Utilice esta guía paso a paso para generar Formato de texto enriquecido (RTF) a partir del Lenguaje de marcado extensible (XML) mediante Visual Basic .NET.

El Formato de texto enriquecido es un formato basado en texto que codifica el texto con formato, el diseño del documento y los gráficos. Suele utilizarse con Microsoft Word. Puesto que el RTF se basa en texto, se puede generar fácilmente mediante código. Si tiene datos XML que desea mostrar en Word como un documento de tipo catálogo/lista o de combinación de correspondencia, la conversión de los datos XML en una secuencia RTF puede ser una solución ideal. De hecho, si está desarrollando una solución en la que genera documentos en un servidor Web, es preferible generar esos documentos utilizando un formato basado en texto, como HTML o RTF, que utilizar la Automatización de servidor de Word.

Este artículo ofrece código de ejemplo, con instrucciones paso a paso, para convertir XML en RTF con el fin de mostrarlo en Word de varias formas diferentes:
  • Guardar los datos RTF en un archivo y abrirlo en Word.
  • Transferir los datos RTF a Word mediante el Portapapeles de Windows.
  • Transmitir en secuencias los datos RTF a Word alojado en Microsoft Internet Explorer desde una aplicación Web ASP.NET

La especificación del Formato de texto enriquecido (RTF)

La especificación del Formato de texto enriquecido (RTF) es una especificación pública para generar archivos de texto compatibles con RTF. Puede utilizar la documentación de la especificación en el siguiente sitio Web de Microsoft Developer Network (MSDN) como ayuda para crear sus propios archivos RTF. No obstante, la especificación se proporciona "tal cual" y los Servicios de soporte técnico de Microsoft no ofrecen soporte técnico para la misma. Haga clic en los vínculos siguientes para ver las especificaciones de RTF:
Especificación del Formato de texto enriquecido, versión 1.6

Especificación del Formato de texto enriquecido, versión 1.7

Convertir XML en RTF

Puede tomar cualquier código XML válido de cualquier origen y convertirlo en RTF. El procedimiento siguiente ilustra cómo puede convertir código XML personalizado en código RTF guardado en un archivo o copiado al Portapapeles.
  1. Cree una nueva aplicación para Windowsde Visual Basic .NET. Se creará Form1.
  2. Agregue dos controles de botón a Form1.
  3. En el menú Ver, haga clic en Código.
  4. Inserte lo siguiente en la parte superior de la ventana de código, delante de la implementación de la clase Form1:
    Imports System.Xml Imports System.Xml.Xsl Imports System.IO
  5. Agregue el código siguiente a la implementación de la clase Form1 (delante de End Class):
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Text = "A un archivo" Button2.Text = "Al Portapapeles"
    
        End Sub
    
        Private Sub ButtonsClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click, Button2.Click
    
            Dim sPath As String = Directory.GetParent(Directory.GetCurrentDirectory()).ToString
    
            ' Abrir el archivo XML. Dim xmlDoc As New XmlDocument() xmlDoc.Load(sPath & "\Dictionary.xml")
    
            ' Abrir el archivo XSL. Dim xslDoc As New XslTransform() xslDoc.Load(sPath & "\Dictionary.xslt")
    
            Select Case sender.name Case "Button1" ' Convertir el XSL y guardarlo en un archivo. Dim TWrtr As New XmlTextWriter(sPath & "\Dictionary.RTF", System.Text.Encoding.Default) xslDoc.Transform(xmlDoc, Nothing, TWrtr, Nothing) TWrtr.Close() MsgBox("RTF convertido guardado en " & sPath & "\Dictionary.RTF") Case "Button2" ' Convertir el XSL y copiarlo al Portapapeles. Dim SWrtr As New StringWriter() xslDoc.Transform(xmlDoc, Nothing, SWrtr, Nothing) Dim datObj As New DataObject(DataFormats.Rtf, SWrtr) Clipboard.SetDataObject(datObj) SWrtr.Close() MsgBox("RTF convertido copiado al Portapapeles.") End Select
    
        End Sub
  6. Agregue un archivo XML al proyecto:
    1. En el menú Proyecto, haga clic en Agregar nuevo elemento.
    2. En la lista de plantillas, haga clic en Archivo XML.
    3. Escriba el nombre Dictionary.xml y haga clic en Abrir.
    4. Anexe lo siguiente al contenido de Dictionary.xml:
      <Dictionary> <Entries> <Entry> <Word Type="1">Enérgico</Word> <Definition>Tener, ejercer o mostrar energía</Definition> </Entry> <Entry> <Word Type="1">Feliz</Word> <Definition>Disfrute, demostración o caracterizado por placer o alegría</Definition> </Entry> <Entry> <Word Type="2">Emoción</Word> <Definition>Una respuesta subjetiva fuerte y compleja</Definition> </Entry> </Entries> </Dictionary> 
  7. Agregue un archivo XSLT al proyecto:
    1. En el menú Proyecto, haga clic en Agregar nuevo elemento.
    2. En la lista de plantillas, haga clic en Archivo XSLT.
    3. Escriba el nombre Dictionary.xslt y haga clic en Abrir.
    4. Reemplace el contenido de Dictionary.xslt con el código siguiente:
       
      <?xml version="1.0" encoding="UTF-8" ?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      
      	<xsl:output method="text"/> <xsl:template match="/">
      
      	<xsl:text>{\rtf1</xsl:text>
      
      	<xsl:for-each select="Dictionary/Entries/Entry">
      
      		<xsl:text>\par\b </xsl:text> <xsl:value-of select="Word"/> <xsl:text>\b0\i  </xsl:text> <xsl:if test="Word[@Type='1']">adj.</xsl:if> <xsl:if test="Word[@Type='2']">n.</xsl:if> <xsl:text>\i0\par </xsl:text> <xsl:value-of select="Definition"/> <xsl:text>\par</xsl:text> </xsl:for-each>
      
      	<xsl:text>}</xsl:text>
      
      	</xsl:template>
      	
      </xsl:stylesheet>  
  8. Presione F5 para generar y ejecutar el programa.
  9. Haga clic en A un archivo para guardar el código XML convertido en un archivo (Dictionary.rtf). Puede abrir el archivo RTF en Word para examinar los resultados de la transformación.
  10. Haga clic en Al Portapapeles para copiar el código XML convertido al Portapapeles de Windows. Puede pegar entonces el contenido del Portapapeles en un documento de Word nuevo o existente para ver los resultados.

Convertir un DataSet a RTF

Visual Basic .NET le permite realizar fácilmente transformaciones en conjuntos de datos. En este procedimiento se muestra cómo puede tomar datos relacionados de la base de datos de ejemplo Nortwind y convertirlos a RTF. Se muestran dos transformaciones diferentes: un documento RTF sencillo que muestra la información de contacto de los clientes y un documento RTF más complejo que muestra la información de pedidos para los clientes en un formato tipo combinación de correspondencia.
  1. Inicie una nueva aplicación Web ASP.NET de Visual Basic y guárdela en http://localhost/RTFDemo.

    Se creará WebForm1.
  2. Agregue dos controles Button a WebForm1.
  3. En el menú Ver, haga clic en Código.
  4. Agregue el código siguiente a la función Page_Load:
            Button1.Text = "Ver información de contacto" Button2.Text = "Ver pedidos de clientes"
  5. Agregue la siguiente función a la clase WebForm1.

    NOTA: en el código siguiente se da por supuesto que tiene SQL Server instalado en el host local. Si tiene que utilizar otro equipo, cambie el miembro de origen de datos de la cadena de conexión en consecuencia.
        Private Sub ButtonsClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click, Button2.Click
    
            ' Conectar al origen de datos. Dim nwindConn As SqlConnection = New SqlConnection( _ "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI") nwindConn.Open()
    
            ' Crear un conjunto de datos basándose en si solicitó ver una lista ' de pedidos o una lista de contactos. Dim ds As DataSet Dim sXSL As String Select Case (sender.id)
    
                Case "Button1"
    
                    ds = New DataSet("Contacts") Dim ContactsDA As SqlDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", nwindConn) ContactsDA.Fill(ds, "Customers") ' XSLT que hay que usar para convertir este conjunto de datos. sXSL = "Contacts.xslt"  
    
                Case "Button2"
    
                    ds = New DataSet("CustomerOrders")
    
                    Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT CustomerID, CompanyName, " & _ "Address, City, Region, PostalCode, Country FROM Customers", nwindConn) custDA.Fill(ds, "Customers")
    
                    Dim ordersDA As SqlDataAdapter = New SqlDataAdapter("SELECT OrderID, CustomerID, Freight " & _ "FROM Orders", nwindConn) ordersDA.Fill(ds, "Orders")
    
                    Dim ordersdetailDA As SqlDataAdapter = New SqlDataAdapter( _ "SELECT [Order Details].OrderID, Products.ProductName, [Order Details].Quantity, " & _ "[Order Details].[UnitPrice]*[Quantity]*(1-[Discount]) AS ItemTotal " & _ "FROM Products INNER JOIN [Order Details] ON Products.ProductID = [Order Details].ProductID " _ , nwindConn)
    
                    ordersdetailDA.Fill(ds, "OrderDetails")
    
                    nwindConn.Close()
    
                    ds.Relations.Add("CustOrders", _ ds.Tables("Customers").Columns("CustomerID"), _ ds.Tables("Orders").Columns("CustomerID")).Nested = True
    
                    ds.Relations.Add("OrdersToOrdersDetail", _ ds.Tables("Orders").Columns("OrderID"), _ ds.Tables("OrderDetails").Columns("OrderID")).Nested = True
    
                    ' XSLT que hay que usar para convertir este conjunto de datos. sXSL = "CustOrders.xslt" 
    
            End Select
    
            ' Cerrar la conexión con el origen de datos. nwindConn.Close()
    
            ' Convertir el conjunto de datos utilizando la hoja de estilos apropiada. Dim xmlDoc As XmlDataDocument = New XmlDataDocument(ds) Dim xslTran As XslTransform = New XslTransform() xslTran.Load(Server.MapPath(sXSL))
    
            ' Transmitir en secuencia los resultados de la transformación a Word. Response.ContentType = "application/msword" Response.Charset = "" Response.ContentEncoding = System.Text.Encoding.Default xslTran.Transform(xmlDoc, Nothing, Response.Output)
    
        End Sub
  6. Agregue las líneas de código siguientes al principio del archivo WebForm1.aspx.vb, delante de la implementación de la clase WebForma1:
    Imports System.Data.SqlClient Imports System.Xml Imports System.Xml.Xsl
  7. En el menú Proyecto, haga clic en Agregar nuevo elemento. En la lista de plantillas, haga clic en Archivo XSLT, asigne al archivo el nombre Contacts.xslt y haga clic en Abrir.
  8. Reemplace el contenido de Contacts.xslt con el código siguiente:
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    	xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts" >   
    
    <xsl:output method="text"/>
    
    <xsl:template match="/">
    
    	<xsl:text>{\rtf1</xsl:text>
    	
        <xsl:text>{\fonttbl{\f0\froman\fcharset0\fprq2 Times New Roman;}{\f1\fswiss\fcharset0\fprq2 Arial;}}</xsl:text>
        
    	<xsl:text>{\header\pard\fs50 Contactos de mis clientes}</xsl:text>
    	
    	<xsl:text>{\footer\pard\fs18 Página {\field{\*\fldinst PAGE}</xsl:text> <xsl:text>{\fldrslt }} de {\field{\*\fldinst NUMPAGES}{\fldrslt 1}} \par}</xsl:text>
    	
    	<xsl:text>\f1\fs20</xsl:text>
    	
        <xsl:for-each select="Contacts/Customers"> <xsl:text>\par\b </xsl:text><xsl:value-of select="CustomerID"/><xsl:text>\b0</xsl:text> <xsl:text>\par </xsl:text><xsl:value-of select="CompanyName"/> <xsl:text>\par </xsl:text><xsl:value-of select="ContactName"/> <xsl:text>\par </xsl:text><xsl:value-of select="Phone"/> <xsl:text>\par</xsl:text> </xsl:for-each>
    	      
    	<xsl:text>}</xsl:text>
    
    </xsl:template>
    
    <xsl:template match="Customers">
    
        <xsl:text>\par\b </xsl:text><xsl:value-of select="CustomerID"/><xsl:text>\b0</xsl:text> <xsl:text>\par </xsl:text><xsl:value-of select="CompanyName"/> <xsl:text>\par </xsl:text><xsl:value-of select="ContactName"/> <xsl:text>\par </xsl:text><xsl:value-of select="Phone"/> <xsl:text>\par</xsl:text>
    
    </xsl:template>
    
    </xsl:stylesheet> 
  9. En el menú Proyecto, haga clic en Agregar nuevo elemento. En la lista de plantillas, haga clic en Archivo XSLT, asigne al archivo el nombre CustOrders.xslt y haga clic en Abrir.
  10. Reemplace el contenido de CustOrders.xslt con el código siguiente:
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    	xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts" >   
    
    <xsl:output method="text"/>
    
    <msxsl:script language="VB" implements-prefix="user"> Dim CustomerTotal as Double = 0 Dim OrderSubtotal as Double = 0
        
        Function AddToOrderSubtotal(amt) amt.MoveNext OrderSubtotal = OrderSubtotal + System.Convert.ToDouble(amt.Current.Value) End Function
        
        Function GetOrderSubtotal GetOrderSubtotal = OrderSubtotal End Function
        
        Function GetCustomerTotal GetCustomerTotal = CustomerTotal CustomerTotal = 0 End Function
    	
        Function GetOrderTotal(freight) freight.MoveNext nFreight = System.Convert.ToDouble(freight.Current.Value) GetOrderTotal = nFreight + OrderSubtotal CustomerTotal = nFreight + OrderSubtotal + CustomerTotal OrderSubtotal = 0 End Function
            
    </msxsl:script>
    
    <xsl:template match="CustomerOrders">
    
    	<xsl:text>{\rtf1</xsl:text>
    	
    	<xsl:text>{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255; \red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; \red255\green255\blue255;\red221\green221\blue221;}</xsl:text>
    	
    	<xsl:text>{\info{\title Documento RTF de ejemplo}{\author Soporte técnico de Microsoft para desarrolladores}}</xsl:text>
    	
    	<xsl:text>{\header\pard\qc{\fs50 RTF generado por ASP\par}{\fs18\chdate\par}\par\par}</xsl:text>
    	
    	<xsl:text>{\footer\pard\qc\brdrt\brdrs\brdrw10\brsp100\fs18 Página {\field{\*\fldinst PAGE}</xsl:text> <xsl:text>{\fldrslt }} de {\field{\*\fldinst NUMPAGES}{\fldrslt 1}} \par}</xsl:text>
    	
    	<xsl:apply-templates select="Customers"/>
    	      
    	<xsl:text>}</xsl:text>
    
    </xsl:template>
    
    <xsl:template match="Customers">
    
        <xsl:text>\par\pard\fs20\cf2\qr\b </xsl:text><xsl:value-of select="CustomerID"/><xsl:text>\cf0\b0</xsl:text> <xsl:text>\par\pard </xsl:text><xsl:value-of select="CompanyName"/> <xsl:text>\par </xsl:text><xsl:value-of select="Address"/> <xsl:text>\par </xsl:text><xsl:value-of select="City"/> <xsl:text>, </xsl:text><xsl:value-of select="Region"/> <xsl:text> </xsl:text><xsl:value-of select="PostalCode"/> <xsl:text>\par </xsl:text><xsl:value-of select="Country"/> <xsl:text>\par\par</xsl:text>
    
    	<xsl:apply-templates select="Orders"/>
    
    	<xsl:text>\trowd\cellx7000\cellx9000\pard\intbl\ql\b\cbpat1 </xsl:text> <xsl:text>Total de pedidos para el período actual:\cell </xsl:text> <xsl:text>\qr</xsl:text> <xsl:variable name="CustTtl" select="user:GetCustomerTotal()"/> <xsl:value-of select="format-number($CustTtl,'$###0.00')"/> <xsl:text>\cell</xsl:text> <xsl:text>\pard\intbl\row</xsl:text>
    		
    	<xsl:text>\pard\par\pard</xsl:text> <xsl:text>\pard\plain\fs18\cf6\qc</xsl:text> <xsl:choose> <xsl:when test="$CustTtl = 0"> <xsl:text>\b Hace tiempo que no tenemos noticias suyas.\b0 </xsl:text> <xsl:text> Cuando mejor le convenga, llame a su representante de ventas personal </xsl:text> <xsl:text>para que le expliquemos nuestras ofertas especiales para clientes nuevos y ya existentes.</xsl:text> </xsl:when> <xsl:when test="$CustTtl > 2000"> <xsl:text>\b ¡Enhorabuena!\b0  Sus compras durante este período le hacen merecedor de un descuento del \b 20%\b0 </xsl:text> <xsl:text> en uno de sus próximos pedidos. Para aprovechar esta oferta, indique el </xsl:text> <xsl:text>código ABC123XYZ al realizar el pedido.</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text> Agradecemos su relación con Northwind Traders y nos gustaría tener noticias suyas. </xsl:text> <xsl:text>Si tiene alguna pregunta acerca de nuestra nueva línea de productos, o si desea </xsl:text> <xsl:text>un catálogo de la próxima temporada, llame al número 1-888-000-000.</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>\par\pard</xsl:text> <xsl:text>\par \page</xsl:text>
    
    </xsl:template>
    
    <xsl:template match="Orders">
    
    	<xsl:text>\trowd\cellx9000\pard\intbl\cbpat9</xsl:text> <xsl:text>\ql\b </xsl:text><xsl:value-of select="OrderID"/><xsl:text>\b0\cell </xsl:text> <xsl:text>\pard\intbl\row</xsl:text>
    	
    	<xsl:apply-templates select="OrderDetails"/>
    
    	<xsl:text>\trowd\cellx7000\cellx9000\pard\intbl</xsl:text> <xsl:text>\qr Subtotal:\cell </xsl:text> <xsl:value-of select="format-number(user:GetOrderSubtotal(),'$###0.00')"/><xsl:text>\cell</xsl:text> <xsl:text>\pard\intbl\row</xsl:text>
    		
    	<xsl:text>\trowd\cellx7000\cellx9000\pard\intbl</xsl:text> <xsl:text>\qr Costo:\cell </xsl:text> <xsl:value-of select="format-number(Freight,'$###0.00')"/><xsl:text>\cell</xsl:text> <xsl:text>\pard\intbl\row</xsl:text>
    
    	<xsl:text>\trowd\cellx7000\cellx9000\pard\intbl</xsl:text> <xsl:text>\qr Total:\cell </xsl:text> <xsl:value-of select="format-number(user:GetOrderTotal(Freight), '$###0.00')"/><xsl:text>\cell</xsl:text> <xsl:text>\pard\intbl\row</xsl:text>
    		
    	<xsl:text>\trowd\cellx9000\pard\intbl \cell\pard\intbl\row</xsl:text>
    	
    </xsl:template>
    
    <xsl:template match="OrderDetails">
    
    	<xsl:text>\trowd\cellx5000\cellx7000\cellx9000\pard\intbl\ql </xsl:text> <xsl:value-of select="ProductName"/><xsl:text>\cell </xsl:text> <xsl:text>\qc </xsl:text><xsl:value-of select="Quantity"/><xsl:text>\cell </xsl:text> <xsl:text>\qr </xsl:text> <xsl:value-of select="format-number(ItemTotal,'$###0.00')"/><xsl:text>\cell</xsl:text> <xsl:variable name="RunTotal" select="user:AddToOrderSubtotal(ItemTotal)"/> <xsl:text>\pard\intbl\row</xsl:text>
    
    </xsl:template>
    
    </xsl:stylesheet>
  11. En el menú Generar, haga clic en Generar solución.
  12. Inicie Internet Explorer y vaya a http://localhost/RTFDemo/Webform1.aspx.
  13. Haga clic en Ver información de contacto para ver la primera transformación de XML a RTF en Word.
  14. Haga clic en Atrás en Internet Explorer.
  15. Haga clic en Ver pedidos de clientes para ver la segunda transformación de XML a RTF en Word.

Sugerencias para la solución de problemas de RTF

  • Como se ha dicho, el código de ejemplo de la sección Convertir un DataSet a RTF transmite en secuencias el código RTF directamente al explorador. Como alternativa, puede guardar el código RTF en un archivo y redirigir al archivo guardado. Para ello, reemplace estas líneas de código en el ejemplo
    Response.ContentType = "application/msword" Response.ContentEncoding = System.Text.Encoding.Default Response.Charset = "" xslTran.Transform(xmlDoc, Nothing, Response.Output)
    con:
    Dim writer As XmlTextWriter = New XmlTextWriter( _ Server.MapPath("Results.doc"), System.Text.Encoding.Default) xslTran.Transform(xmlDoc, Nothing, writer) writer.Close() Response.Redirect("Results.doc")
    El almacenamiento del código RTF en un archivo de esta forma le permite examinar fácilmente la estructura del RTF en el archivo utilizando cualquier editor de textos, como el Bloc de notas. Una técnica útil para la solución de problemas puede ser almacenar el código RTF en un archivo si la transformación XSL no produce los resultados que esperaba.
  • Al convertir a RTF, tenga cuidado de cómo presenta los espacios en blanco y los retornos de carro en la hoja de estilos, ya que ello puede afectar a la manera en que Word interpreta el código RTF. Los dos ejemplos de código de este artículo utilizan el elemento <xsl:text> porque obliga a conservar toda la información de espacios en blanco.
  • Utilice <xsl:output method="text"> en la hoja de estilos para asegurarse de que el código XML se convierte a texto (en lugar de a XML, que es el método de salida predeterminado). Si no especifica texto como método de salida, se pueden agregar al archivo instrucciones de procesamiento de XML. Esto puede impedir que Word interprete correctamente el texto como RTF.

Referencias

Para obtener información adicional acerca de la Automatización de servidor de Microsoft Word y otras aplicaciones de Office, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
257757 INFO: Aspectos que hay que tener en cuenta para realizar la automatización de Office en el servidor
Para obtener información adicional acerca del uso de RTF en sus soluciones, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
270906 CÓMO: Utilizar ASP para generar un documento de Formato de texto enriquecido (RTF) para transmitir en secuencias a Microsoft Word
258513 CÓMO: Pegar la cadena con formato RichText en Word con Automatización de Visual Basic
Para obtener información adicional acerca de cómo convertir datos XML con Visual Basic .NET, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
300934 CÓMO: Aplicar una transformación XSL a XML para transmisión en secuencias usando Visual Basic .NET
300929 CÓMO: Aplicar una transformación XSL de un documento XML a otro mediante Visual Basic .NET

Propiedades

Id. de artículo: 311461 - Última revisión: viernes, 16 de junio de 2006 - Versión: 5.4
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.0
  • Microsoft Word 2002 Standard Edition
  • Microsoft .NET Framework Class Libraries 1.0
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft ASP.NET 1.1
Palabras clave: 
kbhowto KB311461

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com