Pergunta

Estou usando o VSTS 2008 + C # + .Net 2.0. Ao executar a seguinte declaração, não é FormatException lançada a partir de declaração String.Format, todas as idéias que está errado?

Aqui é onde obter o template.html que estou usando. Eu quero formatar esta parte m = {0} em 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:

Aqui está o conteúdo para o meu 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>

graças em avdance, George

Foi útil?

Solução

Em uma suposição, o html contém javascript ou outra fonte de chaves ({ e }) que todos precisamos duplicar (para {{ e }}) para ser utilizável com string.Format. I esperar um diferente (mais óbvia) testemunho pode ser na ordem, isto é %%FILENAME%%. Em seguida, usar regex ou string.Replace.

Se você tem uma única tag, string.Replace é bom; se você tiver lotes, existem truques com regex e MatchEvaluator que podem ser úteis - como tão mas com um padrão de regex diferente.


Update após o exemplo html acrescentou: Eu definitivamente utilizar um token diferente; no nível mais básico:

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

e

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

Outras dicas

Seu modelo contém { e } caracteres que precisam ser escapados, caso contrário, eles confundem String.Format. Escapar deles usando {{ e }}. Em alternativa, usar um mecanismo diferente tal como String.Replace.

string.Format () não manipular { e } na string de formato. É necessário substituir { com {{ e } com }} em todos os lugares em seu arquivo template.html. Exceto para o único lugar onde você usar o espaço reservado {0}.

Não é muito elegante.

Em vez disso, considere o uso de um modelo de motor. Consulte http://csharp-source.net/open-source/template-engines para algumas sugestões.

A próxima melhor solução é usar expressões regulares (com MatchEvaluator) ou String.Replace (), como sugerido por outras respostas.

Editar:

Aqui está um exemplo usando o modelo de motor StringTemplate:

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

Alterar uma única linha no seu arquivo template.html:

De:

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

para:

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

Quando os encontros motor modelo $content$ no modelo, ele substitui-lo com o valor do atributo 'conteúdo' que você definir usando o código.

Usando StringTemplate, você pode fazer looping simples e condicionais dentro do seu template. Consulte a documentação .

Wat são os conteúdos da variável 'modelo'?

É difícil dizer o que está errado com o seu código, mas, presumivelmente, a variável de modelo não contém uma string que como um lugar titular. (Como "esta é uma string {0}").

Eu acho que você deve fazer uso das ferramentas de seu IDE fornece:. Depurar o código, use relógios para inspecionar o conteúdo da variável de modelo

O que está no arquivo de modelo?

se existem chaves que não são do formato {int} ou não são mais do que existem argumentos para a instrução de formato, ele vai lançar uma exceção.

Qual é a mensagem da exceção?

É seu Css isso é fazê-lo. Como somoene pessoa mencionados você precisa doa regex substituir, ou um monte de String.Replace comandos de uma marca de linha que variáveis ??com %% VARIABLE_NAME %% e uso substituição de string para substituí-los

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top