ASP.NET MVC 4后退按钮 - >表格提交 - > 404

时间:2012-04-30 20:23:48

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

有一些奇怪的行为,我喜欢一些反馈,因为我似乎无法在任何地方找到任何有关此类事情的细节......

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

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

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

我尝试过什么 从我读过的东西开始,我一直专注于围绕缓存的可能解决方案,我已尝试使页面过期或将页面设置为无缓存,但似乎没有解决问题。

CODE

搜索视图:

@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中不会发生此问题,并且在使用后退按钮后,搜索表单会完全重新提交...

2 个答案:

答案 0 :(得分: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/

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

答案 1 :(得分:1)

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