1

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

设置: 使用 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 中不会发生,并且搜索表单在使用后退按钮后会完美地重新提交......

4

2 回答 2

3

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

回顾一下,特别是在 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/

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

于 2012-05-01T15:46:24.910 回答
1

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

于 2012-04-30T20:36:23.733 回答