【问题标题】:Cant access form ele on callback OnSuccess from Ajax.beginform using $('this')无法使用 $('this') 从 Ajax.beginform 的回调 OnSuccess 访问表单 ele
【发布时间】:2017-06-29 20:09:22
【问题描述】:

我在一个视图中有这个代码,在一个 IEnumerable 的 foreach 循环中:

@using (Ajax.BeginForm("PoolDelta", "Characters", 
                       new AjaxOptions
                           {
                               HttpMethod = "Get",
                               InsertionMode = InsertionMode.Replace,
                               UpdateTargetId = crName,                                                
                               OnSuccess = "clearVal()"
                           }))
{
    <form id="@(crName)Form" name="@(crName)Form">
        <fieldset>
            @Html.Hidden("Id",item.CharacterId)
            @Html.Hidden("crNumber", "cr" + item.AssociatedLevel)
            @Html.Hidden("poolName", pnameNoSpace)
            @Html.Hidden("charName",  item.Character.Name)
            @Html.Hidden("crTextBoxName", crName)

            <div class="col-sm-8">
                <input type="number" name="poolDelta" id=@pnameNoSpace />
            </div>
            <div class="col-sm-4">
                <input type="submit" name="crButton" class="btn btn-primary btn-sm" value="Use">
            </div>   
        </fieldset>
    </form>
}

我想为 OnSuccess 回调做这样的事情:

 clearVal = function () {
    $('this').find('input[name=poolDelta]').val(''); 
        }

但是,“this”并不像我想象的那样指代形式。做一些研究here我看到'this'现在指的是我不熟悉的XHR。

我无法对输入的 id 进行硬编码,因为它用于动态生成的列表中。我不能只是将 JS 推到表单附近,因为它在表格内。在表格之外,我失去了任何 c# 名称的范围(比如我试图使用的 @pnameNoSpace)

还有其他方法可以让 OnSuccess 回调以某种方式获取它的关联表单吗?还是给定除 id 之外的某些属性的最接近的输入?

顺便说一句,其他一切都完美无缺。 Ajax 替换了它的目标,如果我用alert() 测试它,就会触发 OnSuccess,一切都很好,除了我想在提交后清除文本输入。我会考虑使用.click() 函数,但是当我无法通过 id 引用输入时,我不知道该怎么做。

【问题讨论】:

    标签: jquery ajax asp.net-mvc


    【解决方案1】:

    问题: 在成功回调中,this 指的是 Ajax 调用的 jqXHR 对象,而不是事件处理程序绑定到的元素。 Learn more about how this works in JavaScript.

    解决方案:您可以在发出 ajax 请求之前将 this 对象保存在变量中。示例如下:

    @using (Ajax.BeginForm("PoolDelta", "Characters", new AjaxOptions
    {
        HttpMethod = "Get",
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = crName,                                                
        OnSuccess = clearVal(this)
    }))
    {
        <form id="@(crName)Form" name="@(crName)Form">
            <fieldset>
                @Html.Hidden("Id",item.CharacterId)
                @Html.Hidden("crNumber", "cr" + item.AssociatedLevel)
                @Html.Hidden("poolName", pnameNoSpace)
                @Html.Hidden("charName",  item.Character.Name)
                @Html.Hidden("crTextBoxName", crName)
                <div class="col-sm-8">
                    <input type="number" name="poolDelta" id=@pnameNoSpace />
                </div>
                <div class="col-sm-4">
                    <input type="submit" name="crButton" class="btn btn-primary btn-sm" value="Use">
                </div>   
            </fieldset>
        </form>
    }
    
    clearVal = function (obj) {
      $(obj).find('input[name=poolDelta]').val(''); 
    }
    

    【讨论】:

    • 我可以在 mvc Ajax.beginform 中这样做还是必须使用原始 ajax?
    • 实际上,如果这按我认为的方式工作,我将不得不使用按钮提交上的单击事件调用函数,但这会遇到我一直遇到的相同问题:引用具有唯一 ID 的表单。所以它不会起作用。
    • 更新了我的答案,确保将调用OnSuccess = clearVal(this) 的ajax 选项代码替换为this 对象以在clearVal 函数中引用相同的内容,如$(obj).find('input[name=poolDelta]').val('');
    • 好吧,是的,这对 Mahesh 很有效,尽管我最终找到了一种稍微不同的方法。我可以将输入 id (@pnameNoSpace) 作为参数传递,例如 OnSuccess = "ClearVal(" + @pnameNoSpace + ")"。然后我的 JS 变成 function ClearVal(param) { $("#" + param.id).val(''); };最后归结为传递参数,但我认为引用实际 id 感觉更好。
    • 是的,要么传递this 对象,要么直接传递id,很高兴它可以工作:)
    猜你喜欢
    • 2011-12-23
    • 2011-11-09
    • 2012-12-14
    • 2011-04-30
    • 2022-07-25
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多