2

在我的 asp mvc 3 应用程序中,我想显示一个相册。这样就会有选中的图片和相册中其他图片的缩略图列表。用户可以看到的缩略图列表仅包含 8 张图片,其他所有图片都将被隐藏。我想要的是从选定的项目开始这个列表,当列表到达末尾而没有完成所有项目时,它将从头开始。

我设法用这段代码做到了,但我发现它又快又脏。有没有我可以使用的内置 C# 函数?

@{int i = 0;}
@foreach (AlbumPhoto albmphoto in Model.AlbumPhotoList
  .Where(p => p.AlbumPhotoId > int.Parse(SinglePhoto))
  .OrderBy(p => p.AlbumPhotoId))
{
    i++;
    string show = "none";
    if (i < 8)
    {
        show = "block";
    }
    <a href="#" style="display: @show">
        <img src="@Url.Content(albmphoto.AlbumPhotoPath)" width="70" height="47" border="0" alt="@albmphoto.AlbumPhotoDescription" />
    </a>                   
}

@foreach (AlbumPhoto albmphoto in Model.AlbumPhotoList
  .Where(p => p.AlbumPhotoId < int.Parse(SinglePhoto))
  .OrderBy(p => p.AlbumPhotoId))
{
    i++;
    string show = "none";
    if (i < 8)
    {
        show = "block";
    }
    <a href="#" style="display: @show">
        <img src="@Url.Content(albmphoto.AlbumPhotoPath)" width="70" height="47" border="0" alt="@albmphoto.AlbumPhotoDescription" />
    </a>                   
}
4

2 回答 2

0

我认为没有内置任何东西可以对 进行“翻转foreachIEnumerable,但是您可以使用 Concat 稍微不那么恶心地解决它,基本上将对象集再次附加到自身。

var photos = Model.AlbumPhotoList
  .Where(p => p.AlbumPhotoId < int.Parse(SinglePhoto))
  .OrderBy(p => p.AlbumPhotoId);

@foreach(var albumphoto in photos.Concat(photos))
{
  i++;
      string show = "none";
      if (i < 8)
      {
          show = "block";
      }
      <a href="#" style="display: @show">
          <img src="@Url.Content(albmphoto.AlbumPhotoPath)" width="70" height="47" border="0" alt="@albmphoto.AlbumPhotoDescription" />
      </a>       
}

如果它跑到最后,它会滚动到下一组。

或者,作为更好的解决方案,您可以 ToList IEnumerable 并使用 a%进行更好的索引:

var photos = Model.AlbumPhotoList
      .Where(p => p.AlbumPhotoId < int.Parse(SinglePhoto))
      .OrderBy(p => p.AlbumPhotoId)
      .ToList();

@for(int i = 0; i < 8; ++i)
{
 if(i < 8)
 {
  show = "block";
 }
 var albumphoto = photos[i % photos.Count];
 <a href="#" style="display: @show">
  <img src="@Url.Content(albmphoto.AlbumPhotoPath)" width="70" height="47" border="0" alt="@albmphoto.AlbumPhotoDescription" />
 </a> 
}
于 2012-09-17T18:50:51.510 回答
0

display一旦你有 8 个条目 ( break;) ,就可以离开循环,而不是改变你的值。

我还没有使用过 asp.net/Linq(试图进入它),但我会尝试做这样的事情(因此认为它是伪代码;如果这是完整的 BS 或其他什么,我愿意接受反馈! ):

@{
    var index = int.Parse(SinglePhoto); // starting index
    var list = Model.AlbumPhotoList.OrderBy(...); // get all images
    // Now duplicate the first 8 elements of the list, then skip the images not visible
    // and then limit the number of visible items to 8
    list = list.Union(list.Top(8)).Skip(index).Top(8).ToList();
}
@foreach(AlbumPhoto photo in list){
    // html output
}
于 2012-09-17T19:01:28.730 回答