سؤال

أنا أستخدم VSTS 2008 + C # + .NET 2.0. عند تنفيذ العبارة التالية، يوجد فورمات إلقاء من بيان 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؟u4myvhbmzg.

تحرير 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. وبعد أتوقع أن يكون رمز مختلفا (أكثر وضوحا) بالترتيب، أي %%FILENAME%%. وبعد ثم استخدم إما Regex أو string.Replace.

إذا كان لديك علامة واحدة، string.Replace على ما يرام؛ إذا كان لديك الكثير، فهناك حيل مع Regex و MatchEvaluator قد يكون ذلك مفيدا - مثل ذلك ولكن مع نمط regex مختلف.


تحديث بعد إضافة مثال 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. لبعض الاقتراحات.

الحل التالي هو استخدام Regyxes (مع Matcherevaluator) أو 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$ في القالب، يحل محله بقيمة سمة "المحتوى" الذي قمت بتعيينه باستخدام التعليمات البرمجية.

باستخدام StringTemplate، يمكنك القيام حلقات وبسيطة في القالب الخاص بك. يرى وثائق.

وات هي محتويات متغير "القالب"؟

من الصعب القول ما هو الخطأ في التعليمات البرمجية الخاصة بك، ولكن من المفترض أن يتضمن متغير القالب سلسلة كحامل مكتبة. (مثل "هذه هي بعض السلسلة {0}").

أعتقد أنه يجب عليك الاستفادة من الأدوات التي يوفرها IDE: قم بتصحيح التعليمات البرمجية، واستخدام الساعات لفحص محتويات متغير القالب.

ما في ملف القالب؟

إذا كانت هناك قوسين مجعدين ليس من التنسيق {int} أو هناك أكثر مما كانت هناك حجج لبيان التنسيق، فسيتم إلقاء استثناء.

ما هي الرسالة في الاستثناء؟

انها css الخاص بك هذا يفعل ذلك. كما ذكر شيء آخر، ستحتاج إلى استبدال Doa Regex، أو مجموعة من أوامر Strings.Replace في صف علامة متغيرات مع ٪٪ Variable_name ٪٪ واستخدام استبدال السلسلة لاستبدالها

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top