2010-03-09 49 views
3

我认为这有一个简单的答案,但由于某种原因,我今天打了一个作家块。我有一个应用程序,人们可以搜索(像任何应用程序:))并生成一个列表视图。从该列表视图中,您可以查看详细信息,这将带您进入详细信息视图。没有JS,只是另一个页面。但是,我想要做的是在细节视图中有一个后退/下一个按钮,这样您就可以解析结果集而无需返回列表,然后选择下一条记录。.NET MVC - 列表和详细视图

我对完成这件事有两个想法。想法1)在我的自定义班级中有下一个/上一个记录字段。但是,这不会起作用,因为搜索查询不一定会返回连续的结果,而且我每次都必须查询数据库以获取这些下一个/上一级列表。想法2)在视图状态中为每个与搜索结果对应的detials视图传递一个ID或一些自定义对象的列表。在这一点上,我不确定与这种方法相关的“开销”。

SO社区的任何建议?

谢谢!

回答

1

构建打开详细信息视图的链接,以便它具有下一个和上一个参数,其中包含前一个/后一个元素的列表以及当前元素的ID。如果你通过索引来遍历列表模型数据而不是使用foreach来做迭代,那么最简单的做法就是 - 这种方式你可以在找到它们的id时引用相对于当前元素的上一个/下一个元素。确保正确处理第一个和最后一个元素。

在您的控制器操作中,下一个/上一个参数应该是可以为空的 - 如果您没有从列表中获取,则不显示下一个/上一个按钮。您可以“发布”详细信息视图操作,并将额外的参数放在表单中而不是网址中,这样用户仍可以为网址添加书签。请注意,这有它自己的问题,但浏览器的后退/前进按钮和刷新。

<% for (int i = 0, len = Model.Count(); i < len; ++i) 
    { 
     Foo model = Model.ElementAt(i); 
     string prev = i == 0 ? null : string.Join(",", Model.Take(i).Select(m => m.ID.ToString()).ToArray()); 
     string next = i == (len - 1) ? null : string.Join(",", Model.Skip(i).Select(m => m.ID.ToString()).ToArray()) 
%> 
    <% using (Html.BeginForm("Details","Bar", new { id = model.ID })) { %> 
     <%= Html.AntiForgeryToken() %> 
     <%= Html.Hidden("Prev", prev) %> 
     <%= Html.Hidden("Next", next) %> 
     <input type="submit" value="Details" /> 
    <% } %> 
<% } %> 

我可能也使用一些jQuery来改变输入按钮用于提交一个点击事件处理程序的封闭形式的链接,但是这只是我的UI偏好。

+0

非常感谢tvan,但是这不仅仅是让我从选中的记录中获得一个动作吗?在点击下一个或上一个按钮进入下一个记录后,我将如何计算这个新记录中的下一个按钮URL? – Tommy 2010-03-09 16:06:17

+0

没有想过 - 将其作为ID列表提供。如果我有机会,我会更新代码,但修改它不应该很难。详情页面必须做同样的事情。 – tvanfosson 2010-03-09 16:11:27

+0

谢谢tvan!我会继续,并标记为回答 – Tommy 2010-03-09 16:21:14