2009-05-20 36 views
5

Sử dụng C# để phát triển ASP.NET và MOSS, chúng tôi thường phải nhúng JavaScript vào mã C# của chúng tôi. Để thực hiện điều này, có vẻ là hai trường phổ biến tư tưởng:Làm cách nào để nhúng các ngôn ngữ lập trình khác vào mã của bạn?

string blah = "asdf"; 
StringBuilder someJavaScript = new StringBuilder(); 
someJavaScript.Append("<script language='JavaScript' >"); 
someJavaScript.Append("function foo()\n"); 
someJavaScript.Append("{\n"); 
someJavaScript.Append(" var bar = '{0}';\n", blah); 
someJavaScript.Append("}\n"); 
someJavaScript.Append("</script>"); 

Nhà trường tư tưởng khác là một cái gì đó như thế này:

string blah = "asdf"; 
string someJavaScript = @" 
    <script language='JavaScript' > 
    function foo() 
    { 
     var bar = '" + blah + @"'; 
    } 
    </script>"; 

Có cách nào tốt hơn so với một trong hai phương pháp này? Tôi thích cá nhân thứ hai, vì bạn có thể thấy toàn bộ phần của JavaScript (hoặc khối ngôn ngữ khác, cho dù SQL hay bạn có gì), và nó cũng hỗ trợ sao chép mã giữa một trình soạn thảo khác cho ngôn ngữ cụ thể đó.

Chỉnh sửa:
Tôi nên đề cập rằng mục tiêu cuối cùng là có JavaScript được định dạng trong trang web cuối cùng.

Tôi cũng đã thay đổi ví dụ để hiển thị tương tác với mã được tạo.

+0

Tôi cũng muốn hỏi điều này. trong khi thứ hai trông sạch hơn, tiếp theo hãy thử đặt tên động của các điều khiển ... sau đó nó trở nên xấu hơn kể từ khi bạn phải sử dụng Control.ClientID –

+0

document.getElementById ("" "+ String.Format (" {0} _ {1} " , base.ClientID, "foobar") + @ "" ") .... –

Trả lời

7

Cách thứ hai rõ ràng là cách, cách rõ ràng hơn. Thực sự không có lý do gì để làm việc đầu tiên.

Tôi sẽ, tuy nhiên, mở rộng nó như thế này:

string someJavaScript = string.Format(@" 
    <script language='JavaScript' > 
     function foo() 
     { 
      var bar = '{0}'; 
     } 
    </script>", blah); 

Nếu bạn có một vài điều cần dính vào bên trong chuỗi, phương pháp string.Format sẽ trở nên khá dễ đọc hơn so nối inline.

+0

đó là một gợi ý rất tốt, mặc dù nó có thể trở nên khó sử dụng nhanh chóng với một loạt các sản phẩm thay thế. –

+1

Vì vậy, bạn có mã hóa đúng các chuỗi bạn đặt trong đó không? Điều gì sẽ xảy ra nếu có dấu nháy đơn hoặc dấu gạch chéo ngược trong đó? Hoặc, trời cấm, một nhà điều hành ít hơn? –

3

Cách thêm JavaScript làm phần tài nguyên vào tệp để tệp có thể được tải dưới dạng tập lệnh (nhúng) từ phần tài nguyên của tệp thực thi?

+0

vâng .. điều này chỉ làm cho nó khó khăn để làm việc với. họ đã bắt đầu từ một bất lợi phải làm việc với MOSS, tốt nhất là chỉ cần làm một cái gì đó như thế này trong hầu hết các trường hợp. –

+0

Không nếu bạn tổ chức mã của bạn một cách cẩn thận. Kinh nghiệm của tôi là thường chỉ có một vài ID và bạn phải kéo từ mã phía máy chủ. Đây có thể được chèn vào trong initializers nhúng nhiều như bạn làm ở trên. Nếu bạn muốn định dạng và khả năng đọc, hãy sử dụng các tệp JS. – Ishmael

+0

@Ishmael, bạn có thể cung cấp ví dụ về cách sử dụng trình khởi tạo cùng với tài nguyên của mình không? –

1

Chuỗi chữ vì một lý do: khả năng đọc.

(hiệu suất không phải là vấn đề, đây là MOSS chúng tôi đang nói về ...)

+0

Điều này áp dụng cho nhiều ngôn ngữ, ví dụ: - nhúng SQL vào VB chẳng hạn. –

5

Cách thứ hai, mặc dù sử dụng tệp bên ngoài tốt hơn nhiều và cho phép sửa đổi được thực hiện cho ứng dụng mà không biên dịch lại tất cả.

Bạn cũng cần có cách dễ đọc, dễ đọc để chèn biến. Cách tiếp cận đơn giản nhất là sử dụng string.Format, nhưng sau đó mỗi biến là {0} hoặc {1} và do đó điều này có thể không đọc được.

Làm thế nào về:

public static string Insert(object dictionary, string into) 
{ 
    foreach (PropertyInfo property in dictionary.GetType().GetProperties()) 
     into = into.Replace("<%" + property.Name + "%>", 
          property.GetValue(dictionary, null).ToString()); 

    return into; 
} 

Sau đó, bạn có thể làm điều này:

string js = Insert(new { divList, url }, 
        @"jQuery(document).ready(function(){ 
         jQuery('#<%divList%>').jqGrid({ 
          url:'<%url%>', 
          datatype: 'json', 
          mtype: 'GET', ... etc..."); 

Hoặc nếu kịch bản là trong một tập tin bên ngoài:

string js = Insert(new { divList, url }, File.ReadAllText("someFile.js")); 

Bạn có thể vượt qua bất kỳ đối tượng và các thuộc tính của nó sẽ được truy cập trực tiếp thông qua cú pháp thoát kiểu ASP.

Thực hiện ở trên không phải là rất hiệu quả, rõ ràng, nhưng nó ngắn.

Khả năng khác là viết trang .aspx trả về JavaScript và sau đó bạn có thể đưa trang đó vào các trang HTML của mình với tham chiếu <script>. Bạn có thể set the ContentType of the pageapplication/x-javascript.

Điều này sẽ cho phép bạn sử dụng các thẻ ASP.NET <%= %> bình thường để sửa đổi và sẽ là giải pháp nhanh, mạnh mẽ với các tệp bên ngoài, tự động biên dịch khi bạn thực hiện chỉnh sửa tập lệnh.

+0

Bạn có thể đưa ra một ví dụ để có nó trong một tập tin bên ngoài để tránh biên dịch lại không? câu trả lời được cung cấp bởi không có đề cập đưa nó vào phần tài nguyên của tệp thực thi, nhưng điều đó sẽ yêu cầu biên dịch lại để thay đổi nó. –

+0

Tôi đã thêm một ví dụ rất đơn giản về điều đó - bạn có thể muốn sử dụng các hàm ánh xạ đường dẫn ASP.NET nếu bạn đang xây dựng loại ứng dụng đó, để định vị tệp trong ứng dụng web của bạn. –

+0

Rất thú vị. Tôi tự hỏi điều này dễ dàng như thế nào với mô hình MOSS Web Part/Solution ... –

1

Chúng tôi đã viết một thư viện chỉ cho mục đích này, cung cấp cú pháp thông thạo để nhúng JavaScript vào mã C#. Bạn có thể đọc thêm về nó here.

Nói tóm lại, ví dụ của bạn sẽ được viết như sau:

var function = JS.Function("foo").Do(
    JS.Var(JS.Id("bar").AssignWith(blah))); 
string someJavaScript = "<script>" + function + "</script>"; 

Thứ nhất, nó sẽ đảm bảo rằng các nội dung của biến blah được trích dẫn đúng cách, nếu nó chứa các ký tự đặc biệt, ví dụ.

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