個人的には、HTML5 の data-* 属性を使用するか、目立たないように AJAX 化する DOM 要素の一部として URL を含めることを好みます。
$.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;
});
あるいは、フォームを AJAX 化しています:
@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;
});
もう 1 つの例は、対応する DOM 要素で適切な URL が利用できない場合に、HTML5 の data-* 属性を使用することです。ドロップダウンの選択が変更されたときに、AJAX を使用してコントローラー アクションを呼び出したいとします。たとえば、カスケード ddl を考えてみてください。
ドロップダウンは次のようになります。
@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 変数は実際には必要ありません。