Javascript ASP.NET MVC/jQuery/AJAX:链接第一次无法工作,但第二次可以工作(页面重新加载后)

Javascript ASP.NET MVC/jQuery/AJAX:链接第一次无法工作,但第二次可以工作(页面重新加载后),javascript,jquery,html,ajax,asp.net-mvc,Javascript,Jquery,Html,Ajax,Asp.net Mvc,前言 对于这个问题,我有一个MVC部分观点。该视图有一个显示文档列表的部分。每个文档都有一个超链接:单击该超链接时,用户将进入第二个页面视图,其中显示其他信息 该链接位于无序列表中: <a style="text-decoration:underline;" onclick="sendToDocketSearch('@currentDocument.DktYear','@currentDocument.DktSequence','@currentDocument.DktSubActionI

前言

对于这个问题,我有一个MVC部分观点。该视图有一个显示文档列表的部分。每个文档都有一个超链接:单击该超链接时,用户将进入第二个页面视图,其中显示其他信息

该链接位于无序列表中:

<a style="text-decoration:underline;" onclick="sendToDocketSearch('@currentDocument.DktYear','@currentDocument.DktSequence','@currentDocument.DktSubActionID');">@currentDocument.DktYear.ToString().PadLeft(2, '0') - @currentDocument.DktSequence.ToString().PadLeft(5, '0')</a>
请注意,页面/视图/表单是在运行以下控制器方法后提交的:

上述控制器方法运行;然后,由于表单已提交,因此会发生页面的HttpPost操作。在我的本地电脑上运行时,会单击链接并加载下一页,不会出现戏剧效果

问题

当我将代码上传到dev/test服务器时,问题就开始了。我不知道在对活动网站进行故障排除时如何使用断点,所以我使用浏览器开发工具来监视网络流量

在my localserver上运行网站时单击链接时,该过程将继续:

  • 超链接将我带到一个方法,在那里我传递要搜索的信息
  • 页面/视图/表单已提交
  • 控制器重定向我要去的地方
当我点击站点上的链接并将其放在服务器上时,第一次点击完全被忽略-网络流量显示它试图通过上面的javascript函数导航到控制器,但失败发生得太快了,我甚至无法截屏。此时页面将再次重新加载

当我第二次点击同一个链接时,它不会失败

我相信view/javascript/controller代码可以工作,因为它在第二次(以及后续的尝试中)可以工作。它只是第一次在服务器上公然失败;之后,用户就没事了。然而,我想防止“第一次”失败,我想知道问题可能是什么

  • 时机不好
  • 我可能传递信息太早(或我的网站/服务器无法正确处理信息太迟)。页面在第二次正确地完成了它,所以我可能只是在“跳枪”,没有再等待页面加载过程自行解决。(也许我可以摆弄一下第一页的
    $(document).ready()
    javascript部分来“延迟”人们点击链接。)

  • 代码错误
  • 如果我真的把事情弄糟了,我很乐意承认错误的代码。可能是我的javascript函数,也可能是控制器中的代码;无论如何,有些东西正在使该函数调用的第一个过程被拒绝。也许我的代码不好,因为问题不会再次发生,我得到了一种错误的安全感(即,我的代码有一些问题,在页面完全加载后,系统愿意原谅)

  • 服务器问题/杂项
  • 我想知道当我上传我的最新更改时是否遗漏了什么,或者我是否应该联系我的网络团队,以防需要激活权限才能使网站顺利工作。我已经就其他事情与他们取得了联系,所以我可能会利用今天的机会

    有一个替代方案可以帮助我防止这个问题的发生,但我想找出“第一次”失败发生的原因。其他类似的行动在网站上第一次失败,我想把解决这个问题的见解应用到他们身上


    感谢您关注这个问题。祝您度过愉快的一天。

    您确定要调用
    submitForm()jQuery.ajax
    完成之前?您的ajax调用是异步的,因此它将命中
    submitForm()在它有时间完成之前。应该
    submitForm()是否在您的
    成功
    事件中?

    调试一个实时站点将通过日志记录完成,您应该写入日志文件以查看幕后发生的事情。这可能是一个好的开始。对于JS,只需登录到控制台,对于您的后端代码,您可以随时登录到事件查看器。在JS中,您只需内联编写
    console.log(您要记录的内容)
    ,其中您要记录的内容几乎是您能想到的任何内容。事件查看器将使用系统定义的对象,您可以在msdn文档中找到该对象。希望这有点帮助。使用chromes调试器,只需在查看网页时点击F12。如果你正在做任何与网络相关的事情,这是学习的最高价值。太棒了。非常感谢你的帮助。我现在就要调试了。还有一件值得一提的事情,使用dev工具窗口,您可以在处理实时页面时添加和删除JS。通过这种方式,您不必进行本地更改并部署它们,只需执行所需的操作,然后在解决问题时更新代码库。我尝试将
    submitForm()
    javascript函数放入我的
    success
    事件中。当我单击触发该调用的链接时,它没有提交表单。然而,你的回答提出了一个极好的观点:时间似乎是问题的一部分。我可以尝试另一个功能,它可能会绕过这个问题;我只是想弄清楚为什么会发生这种事。(顺便说一句:
    submitForm()
    对我来说只是一个快速的fn,相当于
    $('form')。submit()
    )你的成功可能会失败,因为你的ajax调用期望返回
    json
    ,但是你返回了
    View()
    每个jQuery函数都有
    submitForm()
    调用。我尝试使用
    async:false
    ,函数的行为是:运行
    jQuery.ajax
    调用,然后运行我的
    submitForm()。我肯定可以继续进一步检查我的语法。。。我将把你的回答记为我的答案。谢谢你
    
    var sendToDocketSearch = function (yearOfDocket, sequenceOfDocket, dktSubActionIDOfDocket) {
            jQuery.ajax({
                type: "POST",
                url: "@Url.Action("DocketSearchOnDemand")",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify({ docketYear: yearOfDocket, 
                                   docketSequence: sequenceOfDocket,
                                   DktSubActionID: dktSubActionIDOfDocket,
                                 userIsAuthorized: '@Model.userIsAuthorized' }),
                success: function (data) {
                    alert(data);
                },
                failure: function (errMsg) {
                    alert(errMsg);
                }
            });
    
            submitForm();
        }
    
    public ActionResult DocketSearchOnDemand(string docketYear, string docketSequence, decimal DktSubActionID, bool userIsAuthorized, PortalIndexView viewmodel)
        {
            System.Web.HttpContext.Current.Session.Add("userIsAuthorized", userIsAuthorized);
    
            string docketSearch = docketYear + "-" + docketSequence;
            System.Web.HttpContext.Current.Session["DocketSearchOnDemand"] = docketSearch;
            if (DktSubActionID > 0)
            {
                System.Web.HttpContext.Current.Session["DktSubActionID"] = DktSubActionID.ToString();
                System.Web.HttpContext.Current.Session["searchingCustomID"] = true;
            }
            else
            {
                System.Web.HttpContext.Current.Session["DktSubActionID"] = "1";
                System.Web.HttpContext.Current.Session["searchingCustomID"] = false;
            }
    
            return View(viewmodel);
        }