Html.DisplayFor()
入力フィールドではなく、テキストを生成します。したがって、$(this).val()
メソッドを使用するのではなく、$(this).html()
代わりに使用する必要があります。また、コントローラーは整数パラメーターを想定しているため、このテキストが実際に整数を表していることを絶対に確認してください。そうしないと、コントローラー アクションがヒットせず、値を数値に解析できないというエラー メッセージが表示されます。また、AJAX 成功コールバック内this
では、mouseenter コールバックで使用された要素を参照しなくなりました。再度使用したい場合は、クロージャーでキャプチャする必要があります。
$("#cost").live("mouseenter", function () {
var $label = $(this);
var id = $label.html();
alert(id); // this should be a number
$.getJSON('/Price/AjaxGetByPriceId', { id: id }, function (data) {
for (i = 0; i <= data.length; i++) {
$lavel.attr("title", data[i].Url);
}
});
});
また、.live 関数 (完全に廃止され、jQuery 1.9 では削除されています) を関数に置き換えることもお勧めします.on()
。それに加えて、URL ヘルパーを使用してコントローラー アクションへの URL を生成することをお勧めします。
さらに別の発言: あなたが示した div が foreach ループにあるように見えます (ループの現在のアイテムであるmodelItem => item.PriceId
と仮定した場所で使用したラムダによってわかります)。item
しかし、ここでの問題は、同じ .xml を持つ DOM に複数の要素を含めることができないことですid
。したがって、あなたが示したのは無効なマークアップです。class
代わりにセレクターを使用できます。
<div>
<label class="cost" data-url="@Url.Action("AjaxGetByPriceId, Price")">
@Html.DisplayFor(modelItem => item.PriceId)
</label>
</div>
その後:
$(document).on('mouseenter', '.cost', function () {
var $label = $(this);
var id = $label.html();
var url = $label.data('url');
$.getJSON(url, { id: id }, function (data) {
for (i = 0; i <= data.length; i++) {
$label.attr('title', data[i].Url);
}
});
});
また、AJAX コールバックでループしている理由がよくわかりません。
for (i = 0; i <= data.length; i++) {
$label.attr('title', data[i].Url);
}
あなたのコントローラ アクションは、指定された ID を持つ対応するラベルのタイトルを返すはずではありませんか? そのほうが正しいでしょう。