2012-05-08 3 views
4

У меня есть UsersClass, который никогда не будет более 10 предметов. Как я могу отобразить класс пользователя со столом в виде чего-то подобного?asp.net mvc 3 razor & html table

Я хочу показать две строки с 10 клетками

+1

Использование '

'? – Jon

+0

Да. in @foreach –

+0

Не уверен, правильно ли я правильно понял ваш вопрос, имеет ли пользовательский класс 10 свойств? Или вы хотите отобразить 10 свойств из нескольких объектов «UserClass»? –

ответ

10

Как всегда и в каждом приложении ASP.NET MVC Я рекомендую использовать модель представления, которая адаптирована к требованиям зрения. Поэтому с этой точки зрения вы упомянули таблицу, в которой вы хотите группы тех пользователей, от 5 элементов в строке:

public class MyViewModel 
{ 
    public int Key { get; set; } 
    public IEnumerable<UsersClass> Users { get; set; } 
} 

, а затем в действии контроллера:

public ActionResult Index() 
{ 
    // that's your domain model => a list of UsersClass 
    // could be coming from wherever you want 
    var users = Enumerable.Range(1, 7).Select(x => new UsersClass 
    { 
     Id = x 
    }); 

    // Now let's group those users into the view model: 
    // We will have 5 elements per row 
    var model = users 
     .Select((u, index) => new { User = u, Index = index }) 
     .GroupBy(x => x.Index/5) 
     .Select(x => new MyViewModel 
     { 
      Key = x.Key, 
      Users = x.Select(y => y.User) 
     }); 
    return View(model); 
} 

и, наконец, сильно типизированных мнение довольно тривиальные:

@model IEnumerable<MyViewModel> 
<table> 
    @foreach (var item in Model) 
    { 
     <tr> 
      @foreach (var user in item.Users) 
      { 
       <td>@user.Id</td> 
      } 

      <!-- That's just to fill the row with the remaining 
       td if we have less than 5 users. Obviously 
       depending on your requirements you could use 
       a single td with a calculated colspan or something else 
      --> 
      @for (int i = item.Users.Count(); i < 5; i++) 
      { 
       <td></td> 
      } 
     </tr> 
    } 
</table> 

Очевидно, что этот вид может быть упрощена с использованием шаблонов отображения:

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

и в соответствующем шаблоне отображения:

@model MyViewModel 
<tr> 
    @Html.DisplayFor(x => x.Users) 
    @for (int i = item.Users.Count(); i < 5; i++) 
    { 
     <td></td> 
    } 
</tr> 

и шаблон отображения UsersClass:

@model UsersClass 
<td>@user.Id</td> 

и результат:

enter image description here

3

Не уверен, если это именно то, что вы ищете, но если это не так, вы должен был бы легко его изменить:

@* Check to make sure your user class is not null *@ 
@if (Model.UserClass != null) 
{ 
    <table> 
    for (int i = 1; i <= 2; i++) 
    { 
     <tr> 
     for (int j = 1; j <= 5; j++) 
     { 
      <td>if (Model.UserClass[(j*i)-1] != null) { Model.UserClass[(j*i)-1] }</td> 
     } 
     </tr> 
    } 
    </table> 
} 

Я написал это довольно быстро, но это должно быть близко к тому, что вам нужно.