Frage

Ich bin mit VSTS 2008 + c # + .Net 2.0. Wenn die folgende Anweisung ausführen, gibt Format von String.Format Aussage geworfen wird, was irgendwelche Ideen falsch ist?

Hier ist, wo die template.html bekommen Ich verwende. Ich möchte diesen Teil m zu formatieren = {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:

Hier ist der Inhalt für meinen 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>

Vielen Dank im avdance, George

War es hilfreich?

Lösung

Bei einer Vermutung, enthält die HTML-JavaScript oder eine andere Quelle von Klammern ({ und }), die alle brauchen verdoppeln würden ({{ und }}) mit string.Format verwendbar zu sein. Ich erwarte, dass eine andere (offensichtlichen) Token können in Ordnung sein, das heißt %%FILENAME%%. Verwenden Sie dann entweder regex oder string.Replace.

Wenn Sie einen einzelnen Tag haben, string.Replace ist in Ordnung; wenn Sie viel haben, gibt es Tricks, mit regex und MatchEvaluator die hilfreich sein können - wie so aber mit einem anderen RegexMuster.


Update nach dem Beispiel html hinzugefügt: Ich würde auf jeden Fall einen anderen Token verwenden; auf der untersten Ebene:

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

und

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

Andere Tipps

Die Vorlage enthält { und } Zeichen, die maskiert werden müssen, da sie sonst String.Format verwirren. Entfliehen sie {{ und }} verwenden. Alternativ einen anderen Mechanismus verwenden, wie String.Replace.

string.Format () verarbeitet nicht { und } im Format-String. Sie müssen ersetzen { mit {{ und } mit }} überall in Ihrer template.html Datei. Mit Ausnahme der einzigen Stelle, wo Sie den {0} Platzhalter verwenden.

Nicht sehr elegant.

Stattdessen betrachten einen Template-Engine verwenden. Siehe http://csharp-source.net/open-source/template-engines für einige Vorschläge.

Die nächstbeste Lösung ist Regexes zu verwenden (mit MatchEvaluator) oder String.Replace (), wie von anderen Antworten vorgeschlagen.

Edit:

Hier ist ein Beispiel für die String Template-Engine mit:

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

Ändern Sie eine Zeile in Ihrer template.html-Datei:

Von:

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

zu:

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

Wenn die Template-Engine Begegnungen in der Vorlage $content$, ersetzt es mit dem Wert des ‚content‘ Attribut, das Sie mit dem Code festgelegt.

Mit String, können Sie einfach Looping und conditionals innerhalb Ihrer Vorlage tun. Siehe der Dokumentation .

Wat sind die Inhalte der 'Vorlage' Variable?

Schwer zu sagen, was falsch mit Ihrem Code, aber vermutlich das Template-Variable nicht eine Zeichenfolge, die als Platzhalter enthält. (Wie "das ist einige Zeichenfolge {0}").

Ich denke, dass Sie die Verwendung der Tools, um Ihren IDE bietet machen sollte. Debuggen den Code, verwenden Uhren den Inhalt der Template-Variable prüfen

Was ist in der Template-Datei?

, wenn es geschweiften Klammern, die nicht von dem Format {int} sind oder gibt es mehr als gibt es Argumente für die Formatanweisung, wird es eine Ausnahme aus.

Was ist die Botschaft in der Ausnahme?

Es ist Ihre Css das ist, es zu tun. Wie somoene anderes erwähnt Sie doa benötigen ersetzen REGEX oder ein Bündel von String.Replace Befehle in einer Reihe Markierung Sie Variablen mit %% VARIABLE_NAME %% und Ersatz Verwendung Zeichenfolge, sie zu ersetzen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top