【问题标题】:ASP.NET MVC 4 Back Button -> Form Submit -> 404ASP.NET MVC 4 后退按钮 -> 表单提交 -> 404
【发布时间】:2012-05-10 12:45:08
【问题描述】:

如果我有一些奇怪的行为,我希望得到一些反馈,因为我似乎无法在任何地方找到关于这类事情的任何细节......

设置: 使用 ASP.NET MVC 4 和 VS 2010,我创建了一个公司目录应用程序,其中包含一个搜索页面和一个详细信息页面,该页面根据搜索选择显示公司树。

搜索页面非常基本,使用 ajax.beginform 它会根据所选条件返回一个人员列表。单击此人后,您会看到一棵“树”,其中显示了该人、他们的主管和任何下属。

问题 用户搜索某人,点击他们的结果,看到树。当他们单击后退按钮(在树视图上执行或不执行任何其他操作)时,他们将返回到搜索屏幕。他们输入的标准在那里,但结果却不是(如我所料)。如果他们点击搜索或按回车键,用户就会收到 404 page not found 错误...

我的尝试 根据我阅读的内容,我一直专注于围绕缓存的可能解决方案,我尝试过使页面过期或将页面设置为无缓存,但这似乎并没有解决问题。

代码

搜索视图:

@using (Ajax.BeginForm("PersonList", "Home", new AjaxOptions { UpdateTargetId = "results", InsertionMode=InsertionMode.Replace }))
{

        @Html.LabelFor(model => model.LastName)
        @Html.TextBoxFor(model => model.LastName)<br />

        @Html.LabelFor(model => model.FirstName)
        @Html.TextBoxFor(model => model.FirstName)<br />

        <input type="submit" value="Search" />

        <div id="results">
        </div>
}

用于搜索结果的块。这是一个部分视图,也可用于树视图。这就是为什么您会看到块顶部的链接处于条件状态。如果要从搜索页面使用链接,则它是一个强制更改整个页面的 html 链接。但是,如果您已经在树视图上,则导航是通过 ajax 完成的。我收到的 404 错误发生在树视图页面上根本没有导航:

<div id="p@{ Html.DisplayFor(model => model.Id); }" class="personCard">
    <img class="personImg" id="img@{ Html.DisplayFor(model => model.Id); }" src="@Url.Content("~/Photos")/@Html.DisplayFor(model => model.Id)" />
    <div>
        @if(ViewBag.IsForSearch == null) {
            @Ajax.ActionLink(this.Model.FullName, "PersonHierarchy", new { id = this.Model.Id }, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "tree" })
        } else {
            @Html.ActionLink(this.Model.FullName, "Person", new { id = this.Model.Id })
        }
        @if(this.Model.TeamSize > 0) {
            @:&nbsp;(
            @Html.DisplayFor(model => model.TeamSize)
            @:)
        }
        <br />
        @Html.DisplayFor(model => model.Title)<br />
        @Html.DisplayFor(model => model.MailLocationCode), @Html.DisplayFor(model => model.WorkNumber) &nbsp;&nbsp; @Html.DisplayFor(model => model.ExtensionForDisplay)<br />
        @if (this.Model.CellNumber.Trim() != string.Empty)
        {
            @:Cell:
            @Html.DisplayFor(model => model.CellNumber)
            @:<br />
        }
        @Html.DisplayFor(model => model.EmailAddress)
    </div>
</div>

来自服务器的响应:

“/”应用程序中的服务器错误。

找不到资源。说明:HTTP 404。你的资源 正在寻找(或其依赖项之一)可能已被删除, 已更改名称,或暂时不可用。请查阅 以下 URL 并确保其拼写正确。

请求的网址:/

----------------------------------- --------------------------------- 版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.272

编辑: 这似乎特定于 IE 9(在所有模式下)。这种行为在 Chrome 中不会发生,并且搜索表单在使用后退按钮后会完美地重新提交...

【问题讨论】:

  • 查看 Ajax.BeginForm 助手在您按下后退按钮之前和之后生成的 HTML。从提交发布到您的服务器根目录这一事实来看,在您按下后退按钮后,Ajax.BeginForm 帮助程序可能无法正常工作(即未生成正确的 html)。
  • 你是对的,在最初点击页面时,表单标签上有所有的数据绑定语句等。在导航回页面时,没有这些语句,只有一个动作和一个方法。 有趣的是这似乎是特定于 IE 9(在所有模式下)。 Chrome 可以毫无问题地处理后退按钮操作,并且表单会按照应有的方式再次提交...

标签: asp.net asp.net-ajax http-status-code-404 asp.net-mvc-4 back-button


【解决方案1】:

您是否尝试过使用开发人员工具 [F12]、Fiddler、Firebug 等来查看返回 404 错误消息的请求是什么?通过确定返回 404 的请求,您可能可以找出请求不正确的原因。

【讨论】:

  • 是的,我应该在我的原始帖子中包含这个。一旦您单击返回,然后再次尝试单击搜索,帖子将转到:localhost:47651,这将是应用程序的根目录,而不是控制器/操作。这有点像 ajax 表单的绑定没有被重新应用,但我不确定,因为这是后退按钮交互,我将如何解决这个问题。
  • 更新了我的原始问题以包含 404 响应,指示它发布到的 url...
【解决方案2】:

好的...我似乎找到了答案:

回顾一下,特别是在 IE 9 中使用 ASP.NET MVC Ajax 时,使用后退按钮导航回具有 ajax 表单的页面并尝试提交该表单会导致 404 错误。

我最初研究了各种缓存解决方案,试图强制 IE 意识到需要“重新加载”页面(即使 Chrome 和其他浏览器在使用后退按钮时让表单再次工作没有问题)。这显然是正确的路径,但不幸的是我没有走得足够远。解决方案最终将控制器操作(或整个控制器)的 OutputCache 设置为:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]

将该注释添加到控制器中的操作或整个控制器类中解决了问题...感谢 IE...

有关这方面的更多信息,请参阅我的来源: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

感谢所有尝试提供帮助的人。

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2023-03-07
    • 2013-10-05
    相关资源
    最近更新 更多