Domanda

Sto usando Visual Studio Team System 2008 + C # .Net 2.0 +. Quando si esegue la seguente dichiarazione, c'è FormatException gettato dalla dichiarazione String.Format, tutte le idee che cosa è sbagliato?

Qui è dove ottenere la template.html sto usando. Voglio formattare questa parte m = {0} in 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:

Ecco il contenuto della mia 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>

grazie a avdance, George

È stato utile?

Soluzione

A occhio, il HTML contiene JavaScript o un'altra fonte di parentesi ({ e }), che sarebbero tutti sono tenuti raddoppio (a {{ e }}) per essere utilizzabile con string.Format. Mi aspetto differente (più evidente) token potrebbe essere in ordine, cioè %%FILENAME%%. Quindi utilizzare regex o string.Replace.

Se si dispone di un singolo tag, string.Replace va bene; se avete un sacco, ci sono trucchi con regex e MatchEvaluator che possono essere utili - come modo ma con un modello regex diverso.


Aggiornamento sull'esempio html aggiunto: avrei sicuramente utilizzare un token diverso; al livello più elementare:

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

e

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

Altri suggerimenti

Il modello contiene caratteri { e } che devono essere sfuggito, altrimenti si confondono String.Format. Fuga utilizzando {{ e }}. In alternativa, utilizzare un diverso meccanismo come String.Replace.

string.Format () non gestisce { e } nella stringa di formato. È necessario sostituire { con {{ e } con }} ovunque nel file template.html. Fatta eccezione per il singolo posto in cui si usa il segnaposto {0}.

Non molto elegante.

Invece, considerare l'utilizzo di un motore di template. Vedere http://csharp-source.net/open-source/template-engines per alcuni suggerimenti.

La nuova soluzione migliore è quella di utilizzare regex (con MatchEvaluator) o String.Replace (), come suggerito da altre risposte.

Modifica

Ecco un esempio utilizzando il motore di template StringTemplate:

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

Modifica di una sola riga nel file template.html:

Da:

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

a:

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

Quando gli incontri motore di template $content$ nel modello, lo sostituisce con il valore del 'contenuto' attributo che si imposta utilizzando il codice.

Utilizzando StringTemplate, si può fare semplice loop e condizionali all'interno del vostro modello. Vedere la documentazione .

Wat sono il contenuto della variabile del 'modello'?

Difficile dire che cosa 's sbagliato con il tuo codice, ma presumibilmente, la variabile di modello non contiene una stringa che come segnaposto. (Come "questa è una stringa {0}").

Credo che si dovrebbe fare uso degli strumenti vostro IDE offre:. Eseguire il debug del codice, utilizzare orologi per ispezionare il contenuto della variabile di modello

Che cosa è nel file di modello?

se ci sono parentesi graffe che non sono del formato {int} o ci sono più di ci sono argomenti per l'istruzione di formato, sarà un'eccezione.

Qual è il messaggio di eccezione?

E 'questo è il tuo Css farlo. Come somoene altro ha menzionato è necessario doa Regex sostituire o un gruppo di String.Replace comandi in un segno di fila ti variabili con %% %% VARIABLE_NAME e la sostituzione dell'uso stringa di sostituirli

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top