0

我想在鼠标输入时看到标签的标题,我想用 ajax 方法获取标题文本。我的 HTML 代码如下所示:

<div id="class">
     <label id="cost">@Html.DisplayFor(modelItem => item.PriceId)</label>
</div>

这是我的jQuery代码:

$("#cost").live("mouseenter", function () {
    $.getJSON('/Price/AjaxGetByPriceId', { id: $(this).val() }, function (data) {
        for (i = 0; i <= data.length; i++) {
            $(this).attr("title", data[i].Url);
        }
    });
});

这是我的价格控制器中的代码:

[HttpGet]
public ActionResult AjaxGetByPriceId(int id)
{
    var price = priceApp.GetByPriceId(id);

    return Json(price, JsonRequestBehavior.AllowGet);
}

但是进入鼠标后并没有发送请求。怎么了?

4

2 回答 2

2

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 的相应标签的标题吗?那会更正确。

于 2013-03-03T17:00:57.267 回答
0

我不确定,但在选项this中使用它之前保存上下文可能是值得的。可能不再指代该元素。$(this).val()getJSONthis

在你$(this).val()做你的getJSON.

于 2013-03-03T17:05:30.667 回答