質問

私はVSTS 2008 + C#+ .NET 2.0を使用しています。次の文を実行すると、FormatException String.Formatの声明そこからスローされ、任意のアイデアは、何が間違っているのですか?

私が使用していますtemplate.htmlを取得するために、ここで、

ここにあります。 Iはtemplate.htmlこの部分M = {0}をフォーマットする。

    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:

ここに私の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>
avdanceで

おかげで、 ジョージ

役に立ちましたか?

解決

の推測では、HTMLはすべて{と共に使用可能であること(}{{する)倍加必要があるブレース(}}string.Format)のJavaScriptまたは別のソースを含んでいます。私は異なる(より明白な)トークンが、即ち%%FILENAME%%順序であってもよい期待します。その後、正規表現またはstring.Replaceのいずれかを使用します。

あなたは、単一のタグを持っている場合は、

string.Replaceで結構です。 そうのような、異なる正規表現パターンを持つ - あなたは多くを持っている場合、役に立つかもしれ正規表現とMatchEvaluatorとのトリックがあります。

<時間> たとえば、HTMLを追加

アップデート後:私は間違いなく別のトークンを使用します。最も基本的なレベルでます:

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

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

他のヒント

あなたのテンプレートは、そうでない場合、彼らは{を混同し、エスケープする必要が}String.Format文字が含まれています。 {{}}を使用してそれらをエスケープします。あるいは、そのようなString.Replaceような異なるメカニズムを使用します。

String.Formatの()は、書式文字列内{}を処理しません。あなたの{ファイル内のどこにでも{{}}}template.htmlを交換する必要があります。あなたは{0}プレースホルダを使用し、単一の場所を除いて。

非常にエレガントされていません。

その代わり、テンプレートエンジンを使用することを検討してください。 http://csharp-source.net/open-source/template-enginesいくつかの提案のため。

次の最良の解決策は、他の回答によって示唆されるように、またはstring.Replace()(MatchEvaluatorで)正規表現を使用することである。

編集

ここでStringTemplateテンプレートエンジンを使用した例です。

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

あなたのtemplate.htmlファイル内の単一の行を変更します:

から

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

<param name="initParams" value="cc=true,markers=true,m=$content$" />
テンプレートエンジンは、テンプレートで$content$に遭遇すると、

、それはあなたがコードを使用して設定する「コンテンツ」属性の値に置き換えます。

StringTemplateを使用して、あなたのテンプレート内の単純なループや条件文を行うことができます。 ドキュメントを参照してください。

ワット・「テンプレート」変数の内容は?

難しい

「はあなたのコードで間違っては何と言ってますが、おそらく、テンプレート変数はプレースホルダとして文字列が含まれていません。 ( "これは、いくつかの文字列{0}である" など)。

私はあなたのIDEが提供するツールを利用すべきだと思う:コードをデバッグ、テンプレート変数の内容を検査するために時計を使用

いただきましたテンプレートファイルで?

形式{int型}ではないか、FORMAT文の引数がある以上ある中括弧がある場合は、

、それが例外をスローします。

例外ではメッセージは何ですか?

これはあなたのCSSのthatsはそれをやってます。 somoene他には、前述のように、

それらを交換するために、あなたは置き換えるDOAの正規表現する必要があります、またはString.Replaceの束は%% %% VARIABLE_NAMEと使用文字列置換を持つあなたは、変数行マークにコマンド
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top