【问题标题】:ASP.NET MVC/jQuery/AJAX: link fails to work first time, but works second time (after page reloads)ASP.NET MVC/jQuery/AJAX:链接第一次无法工作,但第二次工作(页面重新加载后)
【发布时间】:2015-09-29 09:27:08
【问题描述】:

前言

对于这个问题,我有一个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>

当用户点击链接时,它会将他们带到sendToDocketSearch javascript 函数(准备搜索文档):

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);
    }

上面的控制器方法运行;然后,由于表单已提交,页面的 HttpPost 操作就会发生。在我的本地 PC 上运行它时,单击链接并加载下一页而没有戏剧性。

问题

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

在我的本地服务器上运行网站时单击链接时,该过程继续:

  • 超链接将我带到我传递信息以进行搜索的方法
  • 页面/视图/表单已提交
  • 控制器重定向到我必须去的地方。

当我点击网站上的链接并且它在服务器上时,第一次点击被完全忽略 - 网络流量显示它试图通过上面的 javascript 函数导航到控制器,但是失败发生得太快了,我什至无法截屏。此时页面会重新加载第二次。

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

我相信 view/javascript/controller 代码有效,因为它第二次有效(以及后续尝试)。它只是在服务器上第一次公然失败;之后,用户就很好了。但是,我想防止这种“第一次”失败,我想知道问题可能是什么......

  1. 时机不对

我可能传递信息太早(或者太晚以至于我的网站/服务器无法正确处理它)。该页面第二次正确执行,所以也许我只是“开枪”,而不是等待页面加载过程自行解决。 (也许我可以摆弄第一页的$(document).ready() javascript 部分来“延迟”让人们点击链接。)

  1. 代码错误

如果我真的把事情搞砸了,我会很高兴承认错误的代码。也许是我的 javascript 函数,或者是我控制器中的代码;无论如何,有些东西正在使该函数调用的第一遍被拒绝。也许我的代码很糟糕,因为问题没有第二次发生,而且我得到了一种错误的安全感(即我的代码存在问题,系统愿意在页面完全后原谅/em> 已加载)。

  1. 服务器问题/杂项

我想知道我在上传最新更改时是否遗漏了什么,或者我是否应该联系我的网络团队以防网站需要激活权限才能顺利运行。我已经就其他事情与他们取得了联系,所以我可能会利用今天的机会。

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

感谢您查看此问题。祝你有美好的一天。

【问题讨论】:

  • 调试实时站点将通过日志记录完成,您应该写入日志文件以查看幕后发生的情况。这可能是一个很好的起点。对于 JS 只需登录到控制台,对于您的后端代码,您可以随时登录到事件查看器。
  • 在 JS 中,您只需编写内联 console.log(stuff you want to log),您想要记录的内容几乎就是您能想到的任何内容。事件查看器将使用系统定义的对象,您可以在 msdn 文档中找到该对象。希望能有所帮助。
  • 使用 chromes 调试器,在查看网页时按 F12。有用的链接来学习它developer.chrome.com/devtools/docs/javascript-debugging如果你正在做任何与网络相关的事情,这是学习的最高价值。
  • 太棒了。非常感谢您的帮助。我现在要调试了。
  • 还有一点值得一提,通过开发工具窗口,您可以在使用实时页面时添加和减去 JS。这样您就不必进行本地更改和部署它们,只需执行您需要的操作,然后在解决问题时更新您的代码库。

标签: javascript jquery html ajax asp.net-mvc


【解决方案1】:

您确定要在您的jQuery.ajax 完成之前致电submitForm(); 吗?你的 ajax 调用是异步的,所以它会在它有时间完成之前到达submitForm();submitForm(); 应该出现在您的 success 事件中吗?

【讨论】:

  • 我尝试将submitForm() javascript 函数放入我的success 事件中。当我单击触发该调用的链接时,它不会提交表单。但是,您的回答提出了一个很好的观点:时间似乎是问题的一部分。我可以尝试另一个功能来规避这个问题;我只是想弄清楚它为什么会发生。 (顺便说一句:submitForm() 对我来说只是 $('form').submit() 的快速 fn 等价物。)
  • 您的成功可能失败了,因为您的 ajax 调用期待 json 返回,但您返回的是 View()
  • 每个 jQuery 函数都发生了问题,这些函数也有一个 submitForm() 调用。我尝试使用async: false 并且函数运行:jQuery.ajax 调用运行,然后我的submitForm() 运行。我绝对可以继续进一步检查我的语法......我会将您的回复标记为我的答案。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2023-03-15
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多