2011-11-15 20 views
5

Làm cách nào để đóng <tr> và mở <tr> sau 3 lần lặp lại? Tôi có MVC 3 trong .NET 4.0. Làm thế nào tôi có thể đếm lặp vòng lặp trong MVC 3?Làm thế nào tôi có thể đếm vòng trong mvc3 tại @foreach

Mã hiện tại:

@foreach (var articleOnFirstPage in Model.ArticlesOnFirstSite) 
{ 

<tr> 
    <td><div class="productsFrame"></div></td> 
</tr> 

} 

Tôi muốn có được điều này:

<tr> 
     <td><div class="productsFrame"></div></td> 
     <td><div class="productsFrame"></div></td> 
     <td><div class="productsFrame"></div></td> 
    </tr> 
<tr> 
     <td><div class="productsFrame"></div></td> 
     <td><div class="productsFrame"></div></td> 
     <td><div class="productsFrame"></div></td> 
    </tr> 
<tr> 
     <td><div class="productsFrame"></div></td> 
     <td><div class="productsFrame"></div></td> 
     <td><div class="productsFrame"></div></td> 
    </tr> 
+3

Câu hỏi này không thực sự có ý nghĩa đối với tôi. Nếu bạn có 3 mục trong đối tượng Model.ArticlesOnFirstSite thì đây chính là thứ bạn sẽ nhận được. –

+0

Bạn muốn tổng số ba vòng, hoặc bạn muốn ba vòng cho mỗi articleOnFirstPage? – Maess

+0

'Model.ArticlesOnFirstSite.Take (3)'? – asawyer

Trả lời

5

Bạn có thể thực hiện các nội dung khiêu dâm sau theo quan điểm của bạn:

@model IEnumerable<Foo> 
<table> 
@foreach (var item in from i in Model.Select((value, index) => new { value, index }) group i.value by i.index/3 into g select g) 
{ 
    <tr> 
     @foreach (var x in item) 
     { 
      <td><div class="productsFrame">@x.SomeProperty</div></td> 
     } 
    </tr> 
} 
</table> 

hoặc đơn giản là sử dụng xem các mô hình và làm việc nhóm trong hành động điều khiển của bạn mà rõ ràng là những gì tôi muốn giới thiệu bạn. Thực tế duy nhất mà bạn cần thực hiện điều này có nghĩa là mô hình khung nhìn của bạn không phù hợp với các yêu cầu của khung nhìn của bạn, đó là kết quả nhóm theo 3. Vì vậy, điều chỉnh nó. Không vượt qua IEnumerable<Foo> cho chế độ xem của bạn. Vượt qua IEnumerable<MyViewModel> trong đó rõ ràng MyViewModel sẽ chứa nhóm cần thiết để trong quan điểm của bạn, bạn có thể chỉ đơn giản là vòng lặp hoặc vì tôi ghét viết và foreach vòng trong quan điểm chỉ đơn giản là sử dụng các mẫu hiển thị. Họ sẽ chăm sóc mọi thứ và quan điểm của bạn sẽ trông giống như thế này:

<table> 
    @HtmlDisplayForModel() 
</table> 

Có vẻ tốt hơn so với nội dung khiêu dâm ban đầu phải không?


Như được yêu cầu trong phần nhận xét dưới đây là cách tôi sẽ triển khai điều này bằng cách sử dụng các kiểu xem.

luôn là trong ASP.ứng dụng NET MVC bạn bắt đầu bằng cách xác định mô hình điểm cho rằng sẽ phản ánh các yêu cầu của quan điểm của bạn (mà tôi lặp lại là: hiển thị một bảng với 3 cột):

public class ItemViewModel 
{ 
    public string Title { get; set; } 
} 

public class MyViewModel 
{ 
    public IEnumerable<ItemViewModel> Items { get; set; } 
} 

sau đó bạn chuyển sang bộ điều khiển sẽ điền và vượt qua mô hình điểm này để xem:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // Obviously in a real world application the data is your domain model 
     // and comes from a repository or a service layer depending on the complexity 
     // of your application. I am hardcoding it here for the 
     // purposes of the demonstration 
     var data = Enumerable.Range(1, 30).Select(x => new { Title = "title " + x }); 

     var model = 
      from i in data.Select((value, index) => new { value, index }) 
      group i.value by i.index/3 into g 
      select new MyViewModel 
      { 
       Items = g.Select(x => new ItemViewModel { Title = x.Title }) 
      }; 

     return View(model); 
    } 
} 

và cuối cùng bạn viết quan điểm tương ứng (~/Views/Home/Index.cshtml):

@model IEnumerable<MyViewModel> 
<table> 
    @Html.DisplayForModel() 
</table> 

~/Views/Home/DisplateTemplates/MyViewModel.cshtml trưng bày mẫu:

@model MyViewModel 
<tr> 
    @Html.DisplayFor(x => x.Items) 
</tr> 

và cuối cùng là tương ứng với mẫu ~/Views/Home/DisplateTemplates/ItemViewModel.cshtml display:

@model ItemViewModel 
<td>@Html.DisplayFor(x => x.Title)</td> 

và đó là khá nhiều đó. Đơn giản, sạch sẽ, tuân theo các thực hành và quy ước tốt.

Rõ ràng để mang lại điều này một bước xa hơn bạn sẽ giới thiệu AutoMapper để thực hiện việc lập bản đồ thực tế giữa các mô hình tên miền của bạn và xem mô hình và bạn sẽ kết thúc với một giải pháp rất thanh lịch mà sẽ trông như thế này:

public ActionResult Index() 
{ 
    IEnumerable<DomainModel> data = ... 
    var viewModel = Mapper.Map<IEnumerable<DomainModel>, IEnumerable<MyViewModel>>(data); 
    return View(viewModel); 
} 

hoặc một bước xa hơn:

[AutoMap(typeof(IEnumerable<DomainModel>), typeof(IEnumerable<MyViewModel>))] 
public ActionResult Index() 
{ 
    IEnumerable<DomainModel> data = ... 
    return View(data); 
} 

Bây giờ chúng tôi đang bắt đầu kinh doanh nghiêm túc.

+0

thx cho câu trả lời Darin. Và trông giống như thế nào @HtmlDisplayForModel()? Tôi phải làm điều này trong kiểm soát? – senzacionale

+1

@senzacionale, tôi đã cập nhật câu trả lời của mình để minh họa rằng với một ví dụ cụ thể minh họa các thực tiễn mà tôi đang rao giảng. –

+0

uu đẹp Darin. Cám ơn – senzacionale

5

Việc đầu tiên mà nói đến cái tâm là Phil Haack của better foreach loop

Sử dụng nó, bạn đạt được một chỉ mục và có thể sử dụng nó như

<ol> 
@Model.Each(@<li>Item @item.Index of @(Model.Count() - 1): @item.Item.Title</li>) 
</ol> 

Những gì bạn đang tìm cách cụ thể cho nên một cái gì đó như:

@Model.ArticlesOnFirstSite.Each(@<td><div class="productsFrame"></div></td>@(@item.Index % 3 == 0 ? "</tr><tr>" : "")) 
3

Something như thế này có thể làm việc.

@{int i = 0;} 
@foreach (var articleOnFirstPage in Model.ArticlesOnFirstSite) 
{ 
    @if ((i++ % 3) == 0) { 
     @if (i != 1) { 
      @:</tr> 
     } 
     @:<tr> 
    } 

    @:<td><div class="productsFrame"></div></td> 
} 

@if (i != 0) { 
    @:</tr> 
} 

Và đây là giải pháp bạo lực cho vấn đề của bạn.

Như khác đã gợi ý và như tôi đề nghị, bạn nên thay đổi phương pháp của bạn: sử dụng mô hình điểm, các mục nhóm bằng 3.

Về cách sử dụng một cách chính xác mô hình MVC bạn có thể tìm trên web. http://msdn.microsoft.com/en-us/library/gg416514(v=vs.98).aspx là một khởi đầu tốt.

+0

Điều này khiến mắt tôi đau. –

+0

@DarinDimitrov có, tôi đồng ý với bạn, anh ấy nên sử dụng các mô hình xem. –

+0

Nếu bạn đồng ý tại sao bạn lại đề xuất mã không đọc được như vậy? Tôi có nghĩa là trông khủng khiếp. Một người thuần túy như tôi chỉ đơn giản là không thể chấp nhận mã như vậy trong một cái nhìn. Chỉ đơn giản đề xuất sử dụng mô hình xem trong trường hợp này. Nó sẽ là điều đúng đắn để làm. Trên thực tế đó là điều đúng để làm trong mọi ứng dụng ASP.NET MVC :-) –

0

Giống như những người khác đã nói, giải pháp tốt nhất và đẹp nhất có lẽ là để làm các nhóm trong bộ điều khiển, nhưng điều này có thể hoàn thành công việc:

@for (int i = 0; i < Model.ArticlesOnFirstSite.Count; i += 3) 
{ 
    <tr> 
     @foreach (Article article in Model.ArticlesOnFirstSite.Skip(i).Take(3)) 
     { 
      <td>@article.Title</td> 
     } 
    </tr> 
} 
Các vấn đề liên quan