Подтвердить что ты не робот

Исключение String.Format, когда строка формата содержит "{"

Я использую VSTS 2008 + С# +.Net 2.0. При выполнении следующей инструкции существует исключение FormatException, выведенное из инструкции String.Format, любые идеи, что не так?

Вот где взять template.html, который я использую. Я хочу отформатировать эту часть m = {0} в 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

ИЗМЕНИТЬ 1:

Вот содержимое моего шаблона .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="#" onclick="location.href='http://go.microsoft.com/fwlink/?LinkID=115261'; return false;" 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, Джордж

4b9b3361

Ответ 1

В предположении, что html содержит javascript или другой источник фигурных скобок ({ и }), которые все должны удвоить (до {{ и }}), которые можно использовать с string.Format. Я ожидаю, что другой (более очевидный) токен может быть в порядке, т.е. %%FILENAME%%. Затем используйте либо регулярное выражение, либо string.Replace.

Если у вас есть один тег, string.Replace в порядке; если у вас есть много, есть трюки с регулярным выражением и MatchEvaluator, которые могут быть полезны - как это, но с другим шаблоном регулярного выражения.


Обновление после добавления примера html: я бы определенно использовал другой токен; на самом базовом уровне:

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

и

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

Ответ 2

В вашем шаблоне содержатся символы { и }, которые должны быть экранированы, в противном случае они путают String.Format. Побег их с помощью {{ и }}. В качестве альтернативы используйте другой механизм, например String.Replace.

Ответ 3

string.Format() не обрабатывает { и } в строке формата. Вам нужно заменить { на {{ и } на }} всюду в вашем файле template.html. За исключением одного места, где вы используете заполнитель {0}.

Не очень элегантный.

Вместо этого рассмотрите использование механизма шаблонов. См. http://csharp-source.net/open-source/template-engines для некоторых предложений.

Следующее лучшее решение - использовать регулярные выражения (с MatchEvaluator) или string.Replace(), как предложено другими ответами.

Edit:

Вот пример использования механизма шаблонов 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$ в шаблоне, он заменяет его значением атрибута 'content', который вы устанавливаете с помощью кода.

Используя StringTemplate, вы можете сделать простой цикл и условные обозначения в своем шаблоне. См. документацию.

Ответ 4

Wat - это содержимое переменной шаблона?

Сложно сказать, что неправильно с вашим кодом, но, предположительно, переменная шаблона не содержит строку, которая в качестве владельца места. (Как "это некоторая строка {0}" ).

Я думаю, что вы должны использовать инструменты, которые предоставляет ваша IDE: отлаживать код, использовать часы для проверки содержимого переменной шаблона.

Ответ 5

Что в файле шаблона?

если имеются фигурные скобки, которые не имеют формат {int}, или есть больше, чем есть аргументы для оператора формата, он выдает исключение.

Что такое сообщение в исключении?

Это ваш Css, который это делает. Как уже упоминалось в somoene, вам нужно заменить do regex или группу команд String.Replace в строке, вы перечислите переменные %% VARIABLE_NAME %% и замените их на замену