Pregunta

Estoy usando VSTS 2008 + + C # .Net 2.0. Al ejecutar la siguiente declaración, se FormatException lanzada desde la declaración String.Format, alguna idea de lo que está mal?

Aquí es donde para obtener el template.html que estoy utilizando. Quiero dar formato a esta parte m = {0} en template.html.

    string template = String.Empty;
    using (StreamReader textFile = new StreamReader("template.html"))
    {
        template = textFile.ReadToEnd();
        String.Format(template, "video.wmv");
    }

http://www.mediafire.com/download.php?u4myvhbmmzg

EDIT 1:

Este es el contenido de mi template.html,

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<!-- saved from url=(0014)about:internet -->
<head>
    <title>Silverlight Project Test Page </title>

    <style type="text/css">
    html, body {
        height: 100%;
        overflow: auto;
    }
    body {
        padding: 0;
        margin: 0;
    }
    #silverlightControlHost {
        height: 100%;
    }
    </style>

    <script type="text/javascript">
        function onSilverlightError(sender, args) {

            var appSource = "";
            if (sender != null && sender != 0) {
                appSource = sender.getHost().Source;
            } 
            var errorType = args.ErrorType;
            var iErrorCode = args.ErrorCode;

            var errMsg = "Unhandled Error in Silverlight 2 Application " +  appSource + "\n" ;

            errMsg += "Code: "+ iErrorCode + "    \n";
            errMsg += "Category: " + errorType + "       \n";
            errMsg += "Message: " + args.ErrorMessage + "     \n";

            if (errorType == "ParserError")
            {
                errMsg += "File: " + args.xamlFile + "     \n";
                errMsg += "Line: " + args.lineNumber + "     \n";
                errMsg += "Position: " + args.charPosition + "     \n";
            }
            else if (errorType == "RuntimeError")
            {           
                if (args.lineNumber != 0)
                {
                    errMsg += "Line: " + args.lineNumber + "     \n";
                    errMsg += "Position: " +  args.charPosition + "     \n";
                }
                errMsg += "MethodName: " + args.methodName + "     \n";
            }

            throw new Error(errMsg);
        }
    </script>
</head>

<body>
    <!-- Runtime errors from Silverlight will be displayed here.
    This will contain debugging information and should be removed or hidden when debugging is completed -->
    <div id='errorLocation' style="font-size: small;color: Gray;"></div>

    <div id="silverlightControlHost">
        <object data="data:application/x-silverlight," type="application/x-silverlight-2" width="500" height="240">
            <param name="source" value="ClientBin/VideoPlayer.xap"/>
            <param name="onerror" value="onSilverlightError" />
            <param name="background" value="white" />
            <param name="initParams" value="cc=true,markers=true,m={0}" />
            <a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;">
                <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>
            </a>
        </object>
        <iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe>
    </div>
</body>
</html>

gracias en avdance, George

¿Fue útil?

Solución

En una conjetura, el HTML contiene javascript u otra fuente de llaves ({ y }) que toda la necesidad de duplicación (a {{ y }}) para ser utilizable con string.Format. Espero un contador diferente (más evidente) puede estar en orden, es decir %%FILENAME%%. Use expresiones regulares o string.Replace.

Si usted tiene una sola etiqueta, string.Replace está muy bien; si tienes un montón, hay trucos con expresiones regulares y MatchEvaluator que pueden ser útiles - como así pero con un patrón de expresión diferente.


Actualizar a ejemplo html añadido: Definitivamente, me gustaría utilizar un identificador diferente; en el nivel más básico:

<param name="initParams" value="cc=true,markers=true,m=%%FILENAME%%" />

y

template = template.Replace("%%FILENAME%%", "video.wmv");

Otros consejos

La plantilla contiene { y } caracteres que deben ser escapado, de lo contrario se confunden String.Format. Escapar de ellos utilizando {{ y }}. Alternativamente, utilizar un mecanismo diferente, como String.Replace.

string.Format () no controla { y } en la cadena de formato. Es necesario sustituir { con {{ y } con }} todas partes en su archivo template.html. Excepto por el solo lugar en el que utiliza el marcador de posición {0}.

No es muy elegante.

En su lugar, considerar el uso de un motor de plantillas. Ver http://csharp-source.net/open-source/template-engines para algunas sugerencias.

La siguiente mejor solución es utilizar expresiones regulares (con MatchEvaluator) o String.Replace (), como se sugiere en otras respuestas.

Editar

Aquí hay un ejemplo usando el motor de plantillas StringTemplate:

StringTemplate htmlpage = new StringTemplate(File.ReadAllText("template.html"));
htmlpage.SetAttribute("content", "video.wmv");
Console.WriteLine(htmlpage.ToString());

Cambiar una sola línea en su archivo template.html:

De:

<param name="initParams" value="cc=true,markers=true,m={0}" />

a:

<param name="initParams" value="cc=true,markers=true,m=$content$" />

Cuando los encuentros motor de plantillas $content$ en la plantilla, se lo reemplaza con el valor del 'contenido' atributo que establece el uso de código.

El uso de StringTemplate, se puede hacer bucles y condicionales simple dentro de su plantilla. Ver la documentación .

Wat es el contenido de la variable de 'plantilla'?

Es difícil decir lo que está mal con su código, pero es de suponer, la variable de plantilla no contiene una cadena que como un lugar titular. (Al igual que "esto es una cadena {0}").

Creo que se debe hacer uso de las herramientas que su IDE proporciona:. Depurar el código, el uso de relojes de inspeccionar el contenido de la variable de plantilla

¿Qué hay en el archivo de plantilla?

si hay llaves que no son del formato {int} o hay más de que hay argumentos para la instrucción de formato, que va a lanzar una excepción.

¿Cuál es el mensaje de la excepción?

Es eso sus Css hacerlo. Como somoene más ha dicho que necesita para DOA expresiones regulares sustituir, o un montón de String.Replace comandos en una fila que marca las variables con %% %% VARIABLE_NAME uso y sustitución de cadena para reemplazarlos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top