【发布时间】: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) {
@: (
@Html.DisplayFor(model => model.TeamSize)
@:)
}
<br />
@Html.DisplayFor(model => model.Title)<br />
@Html.DisplayFor(model => model.MailLocationCode), @Html.DisplayFor(model => model.WorkNumber) @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