JQuery ajax帖子只在第一次工作

时间:2014-07-13 14:04:56

标签: c# asp.net-mvc

编辑(我已经解决了这个问题):


我已经想到了这一点 - 我在JSON数据中返回一个字符串(integer.ToString(“C”)),然后将其放入我的文本框中。点击提交按钮后,它试图将货币(现在:“£2.99”)解析成一个整数(currentAmount是我的出价对象中的一个整数),这当然变为0,这导致我的出价形式无法生效序列化这些数据。


目前我通过JQuery获得了一个Ajax请求,它在我的BID控制器方法上执行回发。该方法返回一些JSON,它允许我使用当前值更新我的HTML,例如当前价格,出价计数和下一个建议出价。

我的问题是,一旦我点击提交按钮,ajax会发布帖子并正确返回我期望的数据。但是,当我第二次点击“提交”按钮时,从我的视图传递到我的控制器的出价没有我的表单数据(金额现在为0,当我看到它不在页面上时)

这是为什么?我正在使用实体框架来保存我的拍卖和出价。

这是我的代码:

控制器BID帖子

    [HttpPost]
    public ActionResult Bid(Bid bid)
    {
        var db = new AuctionsDataContext();
        var auction = db.Auctions.Find(bid.AuctionId);

        bid.Username = User.Identity.Name;
        auction.Bids.Add(bid);
        auction.CurrentPrice = bid.Amount;
        db.SaveChanges();

        return Json(new
        {
            CurrentPrice = bid.Amount.ToString("C"),
            BidCount = auction.BidCount,
            Number = (bid.Amount + 1).ToString("C")
        });

    }

我在Auction.cshtml上的BID表格

    <p>
    @using (Html.BeginForm("Bid", "Auctions"))
    {
        var lowestBidAmount = auction.CurrentPrice.GetValueOrDefault(auction.StartPrice) + 1;

        <span>
            Bid: $@Html.TextBox("amount", lowestBidAmount)
            @Html.ValidationMessage("amount")
        </span>

        @Html.Hidden("auctionId", auction.Id)

        <input class="post-bid" type="submit" value="Bid" />
    }
</p>

我的Ajax脚本

@section Scripts{
<script type="text/javascript">
    $(function () {
        $('.post-bid').on("click", function () {
            var form = $(this).parent("form");

            $.ajax({
                type: "POST",
                url: form.attr('action'),
                data: form.serialize()
            })
                .success(function (data) {
                    var template = $('#current-price-template').clone().html();

                    var html = template
                        .replace('{{CurrentPrice}}', data.CurrentPrice)
                        .replace('{{BidCount}}', data.BidCount);

                    $('.current-price').replaceWith(html);

                    $('#amount').val(data.Number);
                })
                .error(function () {
                    alert("Your big has been rejected");
                });

            return false;
        });
    });
</script>

2 个答案:

答案 0 :(得分:0)

我无法看到模板的内容,但我的猜测是您要替换附加了click事件的内容,因此当您更换dom元素时,您将失去click事件绑定。这种类型的绑定称为直接绑定。

要实现所需的功能类型,您需要使用委托的绑定样式,其中click事件处理程序绑定到父元素或更高级别,绑定调用中的selector参数指定要处理click事件的哪些元素。这种类型的事件绑定称为委托。替换内容时,处理程序仍然存在,并且可用于处理选择器标识的子元素中的事件。

在你的情况下,像。

form.on('click', '.post-bid',eventHandler);

有关更详细的说明,请参阅jquery .on语句的文档 http://api.jquery.com/on/

答案 1 :(得分:0)

我已经想到了这一点 - 我在JSON数据中返回一个字符串(integer.ToString(“C”)),然后将其放入我的文本框中。点击提交按钮后,它试图将货币(现在:“£2.99”)解析成一个整数(currentAmount是我的出价对象中的一个整数),这当然变为0,这导致我的出价形式无法生效序列化这些数据。