2009-05-20 7 views
5

ASP.NETとMOSSの開発にC#を使用すると、JavaScriptをC#コードに埋め込む必要があることがよくあります。これを実現するためには、思考の2つの流行の学校があるように思われる:他のプログラミング言語をコードにどのように埋め込むのですか?

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>"); 

思考の他の学校はこのようなものです:

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

これらの2つの方法のいずれかのより良い方法はありますか?私はJavaScript(または他の言語ブロック、SQLかどうか)の全セクションを見ることができ、その特定の言語の別のエディタ間でコードをコピーするのを助けるので、2番目のコードは個人的に好きです。

編集:
最終的な目標は、最終的なウェブページでJavaScriptをフォーマットしていることです。

また、生成されたコードとのやり取りを表示するように例を変更しました。

+0

私はこれも尋ねることを意味してきました。 2番目のクリーナーを見ている間は、次に動的なコントロールの名前を付けてみてください... Control.ClientIDを使用しなければならないので、さらに醜いことがあります –

+0

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

答えて

7

秒は明らかに明確な道、道、です。最初にやることには何の理由もありません。

私は、しかし、これにそれを拡張します:

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

あなたは文字列内固執するには、いくつかのものを持っている場合は、String.Formatのメソッドはインライン連結よりもむしろ、より読みになるだろう。

+0

これは非常に良い提案ですが、大量の代用品ですばやく扱いにくくなる可能性があります。 –

+1

あなたはそこに入れた文字列を正しくエンコードしていますか?そこにアポストロフィやバックスラッシュがあるとどうなりますか?あるいは、天は禁止されています。 –

3

JavaScriptをリソースセクションとしてファイルに追加すると、実行可能ファイルのリソースセクションから(埋め込み)スクリプトとしてロードできるようになりますか?

+0

えええええええええええええええええれば、これはうまく動作しません。彼らはすでにMOSSを使用しなければならないという不利益から始めています。ほとんどの場合、このようなことをするのが最善です。 –

+0

コードを慎重に整理しているわけではありません。私の経験では、通常はわずかなIDしかなく、サーバー側のコードから抜き取らなければならないということです。これらは、上記のように埋め込まれたイニシャライザに挿入することができます。書式設定や読みやすさを望む場合は、JSファイルを使用します。 – Ishmael

+0

@Ishmael、リソースでイニシャライザを使用する例を教えてください。 –

1

文字列リテラルの1つの理由:可読性。

(パフォーマンスは、これは我々が話しているMOSS非問題です...)

+0

これは多くの言語に適用されます。たとえば、VBでのSQLの埋め込みです。 –

5

第2の方法ですが、外部ファイルを使用する方がはるかに優れており、アプリケーションをすべて再コンパイルせずに変更を加えることができます。

また、変数を挿入するための読みやすい方法が必要です。最も簡単な方法はstring.Formatを使用することですが、各変数は{0}または{1}です。したがって、これは判読できない可能性があります。

方法について:

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; 
} 

次にあなたがこれを行うことができます:

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

またはスクリプトを外部ファイルにある場合:

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

あなたは任意のオブジェクトを渡すことができますをし、そのプロパティはASPスタイルのエスケープ構文で直接アクセスできます。

上記の実装はあまり効率的ではありませんが、それは間違いです。

JavaScriptを返す.aspxページを作成し、HTMLページに<script>参照を含めることもできます。 set the ContentType of the pageapplication/x-javascriptにすることができます。

これにより、通常のASP.NET <%= %>タグを使用して修正できます。また、スクリプトを編集するときに自動的に即座にコンパイルされた、高速で堅牢な外部ファイルによるソリューションになります。

+0

再コンパイルを避けるために外部ファイルに含める例を挙げることはできますか?回答者は何も言及していませんが、実行可能ファイルのリソースセクションに入れますが、それを変更するには再コンパイルが必要です。 –

+0

私は非常に簡単な例を追加しました。あなたは、そのような種類のアプリケーションを構築する場合、ASP.NETパスマッピング関数を使用して、Webアプリケーション内のファイルを探したいと思うかもしれません。 –

+0

非常に興味深い。これがMOSSのWebパーツ/ソリューションのパラダイムにいかに簡単に変換されるのだろうか... –

1

JavaScriptをC#コードに埋め込むための流暢な構文を提供するために、この目的のためだけにライブラリを作成しました。あなたはそれについてもっと読むことができますhere。要するに

、あなたの例のように書かれます:

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

それは例えば、特殊文字が含まれている場合は、1つの場合、それは、何とか変数の内容を適切に引用されていることを確認します。

関連する問題