我目前正在编写一个简单的MVC 3应用程序,该应用程序显示项目列表,并允许用户过滤项目(在同一页面上)。然后,用户可以单击某个项目,并将被重定向到详细信息页面。
我遇到的问题是,当用户单击"返回列表"时,搜索条件会丢失,当前页面也会丢失(搜索结果会分页)。
我是MVC的新手,似乎不知道该怎么做。
控制器
....
public ActionResult Index(PacketSearch search)
{
const int pageSize = 20;
var allPackets = this.repository.GetAllPackets().Where(p => (string.IsNullOrEmpty(search.FromIp)) || p.FromIp == search.FromIp);
var pagedPackets = new PaginatedList<RawPacket>(allPackets, search.Page ?? 0, pageSize);
search.SearchResults = pagedPackets;
return View(search);
}
public ActionResult Details(int id)
{
var packet = this.repository.GetPacket(id);
return View(packet);
}
主页
....
@if (Model.SearchResults != null && Model.SearchResults.Count > 0)
{
<table>
<tr>
<th>
Timestamp
</th>
<th>
From IP
</th>
</tr>
@foreach (var item in Model.SearchResults) {
<tr>
<td>
@Html.ActionLink(item.TimestampString, "Details", "Packets", new { id = item.Id }, null)
</td>
<td>
@Html.DisplayFor(modelItem => item.FromIp)
</td>
</tr>
}
</table>
}
<br />
@if (Model.SearchResults.HasPreviousPage)
{
@Html.RouteLink("<<<", "Packets", new { page = (Model.SearchResults.PageIndex - 1) })
}
Page @(Model.SearchResults.PageIndex + 1) of @Model.SearchResults.TotalPages
@if (Model.SearchResults.HasNextPage)
{
@Html.RouteLink(">>>", "Packets", new { page = (Model.SearchResults.PageIndex + 1) })
}
详细信息页面
<h2>Packet Details</h2>
<fieldset>
<legend>RawPacket</legend>
<div class="display-label">Timestamp</div>
<div class="display-field">
@Html.DisplayFor(model => model.TimestampString)
</div>
<div class="display-label">FromIp</div>
<div class="display-field">
@Html.DisplayFor(model => model.FromIp)
</div>
</fieldset>
<p>
@Html.ActionLink("Back to List", "Index")
</p>
任何帮助都将不胜感激,谢谢。
您必须将输入保存在某个位置,最好的位置是url(因为它可以被用户缓存和记住)。
在控制器中定义另一个Action,它将完成搜索的主要工作,并通过查询字符串向其发送搜索参数。