문제

VSTS 2008 + C# + .NET 2.0을 사용하고 있습니다. 다음 진술을 실행할 때 string.format 문에서 포르 메이트 락스크가 발생합니다. 어떤 아이디어가 무엇입니까?

여기에 사용중인 Template.html을 얻을 수있는 위치가 있습니다. 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 :

다음은 내 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, George에 감사드립니다

도움이 되었습니까?

해결책

추측 할 때, HTML에는 JavaScript 또는 다른 교정기 소스가 포함되어 있습니다 ({ 그리고 }) 모두 두 배가 필요합니다 (to {{ 그리고 }})와 함께 사용할 수 있습니다 string.Format. 나는 다른 (더 명백한) 토큰이 순서대로 될 것으로 기대합니다. %%FILENAME%%. 그런 다음 Regex 또는 중 하나를 사용하십시오 string.Replace.

단일 태그가있는 경우 string.Replace 괜찮습니다; 많이 가지고 있다면 Regex와 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 몇 가지 제안을 위해.

다음으로 가장 좋은 솔루션은 다른 답변에서 제안한대로 Regexes (matchevaluator) 또는 String.replace ()를 사용하는 것입니다.

편집하다:

다음은 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을 사용하면 템플릿 내에서 간단한 루핑 및 조건부를 수행 할 수 있습니다. 보다 문서.

WAT '템플릿'변수의 내용은?

코드에 무엇이 잘못되었는지 말하기는 어렵지만 아마도 템플릿 변수에는 장소 홀더로 문자열이 포함되어 있지 않습니다. (예 : "이것은 일부 문자열 {0}").

IDE가 제공하는 도구를 사용해야한다고 생각합니다. 코드를 디버깅하고 시계를 사용하여 템플릿 변수의 내용을 검사하십시오.

템플릿 파일에 무엇이 있습니까?

형식 {int}가 아닌 곱슬 괄호가 있거나 형식 문에 대한 인수가있는 것보다 더 많은 괄호가있는 경우 예외가 발생합니다.

예외의 메시지는 무엇입니까?

그것은 당신의 CSS입니다. Somoene Else가 언급했듯이 REGEX 교체 또는 많은 문자열이 필요합니다. 행 마크에서 명령을 다시 표시해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top