2009-07-13 36 views
24

Tôi đang sử dụng VSTS 2008 + C# + .Net 2.0. Khi thực hiện các tuyên bố sau đây, có FormatException ném từ String.Format tuyên bố, bất kỳ ý tưởng gì là sai?String.Format ngoại lệ khi chuỗi định dạng chứa "{"

Đây là nơi để lấy template.html tôi đang sử dụng. Tôi muốn định dạng phần này m = {0} trong 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:

Dưới đây là nội dung cho template.html tôi,

<!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> 

nhờ trong avdance, George

+1

Như bị nghi ngờ, có các dấu ngoặc trong cả kiểu và javascript. Điều đó sẽ không hoạt động trừ khi bạn thoát khỏi chúng, như string.Format tìm thấy một {và panics khi nó không thể tìm thấy một số nguyên và một}. –

+2

btw; bạn hiện không bắt được kết quả của string.Format (các chuỗi .NET không thay đổi, vì vậy string.Format trả về một chuỗi ** mới **; nó không cập nhật chuỗi đầu vào) –

+0

(trả lời nhận xét) –

Trả lời

48

Tại một đoán, html chứa javascript hoặc một nguồn khác của áo ngực ces ({}) tất cả sẽ cần tăng gấp đôi (đến {{}}) để có thể sử dụng được với string.Format. Tôi mong đợi một mã thông báo khác (rõ ràng hơn) có thể theo thứ tự, tức là %%FILENAME%%. Sau đó sử dụng regex hoặc string.Replace.

Nếu bạn có một thẻ, string.Replace là tốt; nếu bạn có rất nhiều, có các thủ thuật với regex và MatchEvaluator có thể hữu ích - like so nhưng với một mẫu regex khác.


Cập nhật sau ví dụ html được thêm: Tôi chắc chắn sẽ sử dụng một mã thông báo khác; ở mức cơ bản nhất:

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

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

Tôi thứ hai kiểm tra này cho các dấu ngoặc nhọn khác. –

+0

Cool, Marc, tôi thích giải pháp thông minh của bạn. – George2

+0

Marc, bạn có thể giải thích những gì bạn có nghĩa là "tất cả sẽ cần gấp đôi (để {{và}}) có thể sử dụng với string.Format", tôi bối rối những gì có nghĩa là cần tăng gấp đôi để có thể sử dụng với string.Format. – George2

1

Wat là những nội dung của biến 'mẫu'?

Khó để nói điều gì sai với mã của bạn, nhưng có lẽ, biến mẫu không chứa một chuỗi làm địa chỉ. (Giống như "đây là một số chuỗi {0}").

Tôi nghĩ rằng bạn nên tận dụng các công cụ mà IDE cung cấp: gỡ lỗi mã, sử dụng đồng hồ để kiểm tra nội dung của biến mẫu.

+0

Tôi có đã đăng template.html của tôi vào bài đăng gốc của tôi trong phần EDIT 1, bất kỳ ý tưởng nào là sai? – George2

0

Có gì trong tệp mẫu?

nếu có dấu ngoặc nhọn không có định dạng {int} hoặc có nhiều hơn đối số cho câu lệnh định dạng, nó sẽ ném một ngoại lệ.

Thông báo trong ngoại lệ là gì?

Đó là Css của bạn đang làm việc đó. Vì somoene khác được đề cập, bạn cần phải thay thế regex hoặc một chuỗi lệnh String.Replace trong hàng đánh dấu các biến của bạn bằng %% VARIABLE_NAME %% và sử dụng thay thế chuỗi để thay thế chúng

+0

Tôi đã đăng template.html vào bài đăng gốc trong phần EDIT 1, bất kỳ ý tưởng nào là sai? – George2

+1

Không có {0} không gây ra ngoại lệ. Các thông số sẽ được bỏ qua. –

+0

đã xóa mệnh đề đó. –

12

Mẫu của bạn chứa {} các ký tự cần được thoát, nếu không chúng sẽ gây nhầm lẫn String.Format. Hãy thoát chúng bằng cách sử dụng {{}}.Ngoài ra, hãy sử dụng một cơ chế khác như String.Replace.

+0

Tôi đã đăng template.html của mình vào bài đăng gốc trong phần EDIT 1, bất kỳ ý tưởng nào là sai? – George2

+1

dấu ngoặc nhọn. –

+0

Frederik, giải pháp là? – George2

6

string.Format() không xử lý {} trong chuỗi định dạng. Bạn cần phải thay thế { bằng {{} với }} ở mọi nơi trong tệp template.html của bạn. Ngoại trừ nơi duy nhất bạn sử dụng trình giữ chỗ {0}.

Không phải rất thanh lịch.

Thay vào đó, hãy xem xét sử dụng công cụ tạo mẫu. Xem http://csharp-source.net/open-source/template-engines để biết một số đề xuất.

Giải pháp tốt nhất tiếp theo là sử dụng regexes (với MatchEvaluator) hoặc string.Replace(), như được đề xuất bởi các câu trả lời khác.

Edit:

Dưới đây là một ví dụ bằng cách sử dụng mẫu động cơ StringTemplate:

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

Thay đổi một dòng trong tập tin template.html của bạn:

từ:

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

tới:

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

Khi động cơ mẫu gặp $content$ trong mẫu, nó sẽ thay thế nó với giá trị của 'nội dung' thuộc tính mà bạn thiết lập sử dụng mã.

Sử dụng StringTemplate, bạn có thể thực hiện lặp vòng đơn giản và điều kiện trong mẫu của mình. Xem the documentation.

+1

Đồng ý. string.Format là một công cụ mẫu tệ hại vì cách nó xử lý các dấu ngoặc ({và}). –

+0

Xin chào codeape, tôi đã nghiên cứu công cụ tạo mẫu, nhưng bối rối tại sao và làm thế nào công cụ tạo mẫu liên quan đến câu hỏi của tôi? – George2

+0

Xin chào Joe, công cụ tạo mẫu liên quan đến câu hỏi của tôi như thế nào? Tôi đang bối rối, bất kỳ ý kiến? – George2

Các vấn đề liên quan