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
您使用的 lambda 来判断,我假设item
是您当前的循环项)。但这里的问题是,您的 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 的相应标签的标题吗?那会更正确。