Question

J'utilise VSTS 2008 + C # + .Net 2.0. Lors de l'instruction suivante, il est FormatException éjecté de la déclaration String.Format, des idées qui ne va pas?

Voici où trouver les template.html je me sers. Je veux formater cette partie m = {0} dans 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:

Voici le contenu de mon 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>

grâce à avdance, George

Était-ce utile?

La solution

Lors d'une estimation, le code HTML contient javascript ou d'une autre source d'accolades ({ et }) qui serait d'être utilisable avec {{ ont besoin de doubler tous (à }} et string.Format). J'attends un autre jeton (plus évident) peut être dans l'ordre, à savoir %%FILENAME%%. Ensuite, utilisez soit regex ou string.Replace.

Si vous avez une seule étiquette, string.Replace est très bien; si vous avez beaucoup, il y a des trucs avec regex et MatchEvaluator qui peuvent être utiles - comme si mais avec un motif différent regex.


Mise à jour après le code html exemple ajouté: Je voudrais certainement utiliser un jeton différent; au niveau le plus élémentaire:

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

et

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

Autres conseils

Votre modèle contient des caractères { et } qui doivent être échappé, sinon ils confondent String.Format. Évadez-les en utilisant {{ et }}. En variante, utiliser un autre mécanisme tel que String.Replace.

string.Format () ne gère pas { et } dans la chaîne de format. Vous devez remplacer { avec {{ et } avec }} partout dans votre fichier template.html. A l'exception du seul endroit où vous utilisez l'espace réservé {0}.

Pas très élégant.

, pensez au lieu d'utiliser un moteur de modèle. Voir http://csharp-source.net/open-source/template-engines pour quelques suggestions.

La prochaine meilleure solution est d'utiliser des expressions rationnelles (avec MatchEvaluator) ou String.replace (), comme suggéré par d'autres réponses.

Modifier

Voici un exemple en utilisant le moteur de template StringTemplate:

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

Modifier une seule ligne dans votre fichier template.html:

à partir de:

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

à:

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

Quand les rencontres de moteur de modèle $content$ dans le modèle, il le remplace par la valeur de l'attribut « contenu » que vous définissez à l'aide du code.

Utilisation StringTemplate, vous pouvez faire boucle simple et conditionals au sein de votre modèle. Voir la documentation .

Wat sont le contenu de la variable 'modèle'?

Difficile de dire ce qui ne va pas avec votre code, mais vraisemblablement, la variable de modèle ne contient pas une chaîne qui, comme un lieu titulaire. (Comme "ceci est une chaîne {0}").

Je pense que vous devriez utiliser les outils de votre IDE fournit:. Déboguer le code, utilisez montres pour inspecter le contenu de la variable de modèle

Ce qui est dans le fichier de modèle?

s'il y a des accolades qui ne sont pas du format {int} ou il y a plus qu'il ya des arguments pour l'instruction de format, il jetteront une exception.

Quel est le message à l'exception?

Il est votre thats Css faire. Comme mentionné somoene sinon vous devrez DOA Regex remplacer, ou un tas de commandes String.Replace dans une marque de ligne que vous variables avec %% %% VARIABLE_NAME et remplacement de chaîne d'utilisation pour les remplacer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top