2013-04-05 10 views
7

私は現在、このアプローチを使用して正しい相対URI(展開状況に関係なく)を取得しています。カミソリコード(asp.netのMVC 3):Url.Content for javascript

@section JavaScript 
{ 
    <script type="text/javascript"> 
     var _getUrl = "@Url.Content("~/bla/di/bla")"; 
    </script> 
} 

別のjsファイル:

$.ajax({ 
    url: _getUrl, 

あなたはより良いアプローチがあると数えるのですか?

+0

スクリプトは、最小化可能な/キャッシング可能なjsファイルに入れる必要があります。 – asawyer

+0

私は同じことをしますが、それが良いことであるかどうかはわかりません。 +1質問:+1 –

+2

@asawyer - あなたのコメントのポイントは何ですか? – cs0815

答えて

6

は個人的に私は使用してHTML5データ - *属性または含む好みますDOMの一部としてのURL私が目立たないAJAXifyの要素。

このようなことは、$.ajaxの呼び出しを書くことはありません。 DOMイベントに対応するように記述します。例えば、アンカーのクリックのように。この場合、それは些細だ、あなただけの、このアンカーを生成するHTMLヘルパーを使用します。その後、

@Html.ActionLink("click me", "someAction", "somecontroller", new { id = "123" }, new { @class = "link" }) 

と:

$('.link').click(function() { 
    $.ajax({ 
     url: this.href, 
     type: 'GET', 
     success: function(result) { 
      ... 
     } 

    }); 
    return false; 
}); 

または多分あなたはフォームをAJAXifyingされています

@using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post, new { id = "myForm" })) 
{ 
    ... 
} 

と次に:

$('#myForm').submit(function() { 
    $.ajax({ 
     url: this.action, 
     type: this.method, 
     data: $(this).serialize(), 
     success: function(result) { 
      ... 
     } 
    }); 
    return false; 
}); 

対応するDOM要素で適切なURLが利用できない場合、HTML5 data- *属性を使用する例もあります。ドロップダウンの選択が変更されたときに、AJAXでコントローラアクションを呼び出すとします。カスケーディングddlsを例と考えてください。

@Html.DropDownListFor(x => x.SelectedValue, Model.Values, new { id = "myDdl", data_url = Url.Action("SomeAction") }) 

、その後:ここ

は、あなたのドロップダウンは次のようになります方法です

$('#myDdl').change(function() { 
    var url = $(this).data('url'); 
    var selectedValue = $(this).val(); 
    $.getJSON(url, { id: selectedValue }, function(result) { 
     ... 
    }); 
}); 

あなたが見ることができるようにあなたが本当にあなたの中で宣言この_getUrlグローバルjavascriptの変数を必要としません。ビュー。

+0

+1私はこれの例を入力しようとしていましたが、あなたはそれを書いた簡潔さを持っています。プラス私は、私はあなたからテクニックを学んだと確信していることを指摘する必要があります。 – asawyer

+0

@ darin-dimitrovこれはかなり良い答えです。ただし、特定の状況(例:「クリック」が意味をなさず、値を格納するために隠しフィールドや他のDOM要素を使用する必要がある場合など)では、不必要なhtmlがページに追加されることがあります。 – LiverpoolsNumber9

+3

なぜそれは不要でしょうか?これにより、javascriptを無効にしてもアプリケーションが引き続き機能します。これをプログレッシブエンハンスメントといいます。 –

0

は、私は、次の操作を行います。

レイザーC#のスクリプトをJavascriptの

@{ 
    var myUrlString = Url.Action("ActionName", new { controller="ControllerName" }); 
} 

はJavaScript

$.ajax('@myUrlString',{ 
    // options 
}); 

前に、あなたはまた、Url.RouteUrlまたはUrl.HttpRouteUrlを使用することができます。 EDIT

- レイザー分離したJSファイル

との一例を示す

@{ 
    var myServerGeneratedValue = Url.Action("ActionName", new{controller="ControllerName"}); 
} 
<script type="text/javascript"> 
    var myHelperObject = new MyHelperObject(); 
    myHelperObject.Init('@myServerGeneratedValue'); 
</script> 

JSファイル

var MyHelperObject = function(){ 

    this.Init = function(serverGeneratedValue){ 
     // do something with serverGeneratedValue 
    }; 

}; 
+0

アクション名は文字列にすることができ、anon型は不要です。 – asawyer

+0

私はこれが好きです。なぜなら、ルーティングが変更されると、発信URIが同期して保持されるようにするからです。しかし、これは、javascriptコードがビューに座る必要があります! – cs0815

+0

@asawyerアクション名**は**文字列であり、現在のものとは別のコントローラ/エリアにルーティングする場合は「anonタイプ」が必要です。また、IDやそれ以外のルーティングデータをどのように追加しますか? – LiverpoolsNumber9