.NET MVC - 列表和详细信息视图

时间:2010-03-09 15:50:04

标签: asp.net-mvc

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

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

来自SO社区的任何建议?

谢谢!

1 个答案:

答案 0 :(得分:1)

构造打开详细信息视图的链接,使其具有包含上一个/后一个元素列表以及当前元素的id的下一个和上一个参数。如果通过索引而不是使用foreach遍历列表模型数据,可能最容易做到 - 这样,您只需在找到其ID时引用相对于当前元素的上一个/下一个元素。确保正确处理第一个和最后一个元素。

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

<% 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将输入按钮更改为使用click事件处理程序提交封闭表单的链接,但这只是我对UI的偏好。