2016-08-09 5 views
0

В режиме бритвы, как я могу прокручивать различные IEnumerables в ViewModel и отображать их переменные в виде столбцов в одной строке?Вернуть viewmodel с IEnumerable для просмотра и использования бритвы для циклических переменных в одну строку

I Возвращает экземпляр ViewModel который заполняется с IEnumerables различных моделей в MVC зрения как так:

ViewModel:

namespace example.ViewModels 
{ 

    public class ClaimModel 
    { 
     public IEnumerable<Claim> Claims { get; set; } 
     public IEnumerable<Member> Members { get; set; } 
     public IEnumerable<ID> IDs { get; set; } 

    } 
} 

Мой контроллер, который возвращают вид выглядит следующим образом:

namespace example.Controllers 
{ 
    public class OfficeManagerController : Controller 
    { 
     private Entities db = new Entities(); //This is my database 

     public ActionResult Index() 
     { 
      IEnumerable<Member> member = db.Members.OrderByDescending(b => b.ClaimID); 
      IEnumerable<Claim> claim = db.Claims.OrderByDescending(b => b.ClaimID); 
      IEnumerable<ID> id = db.IDs; 
      ClaimModel model = new ClaimModel { IDs = id, Members = member, Claims = claim }; 

      return View(model); 
     } 
    } 
} 

Вот отрывок из моей точки зрения бритвы, где я цикл через один из IEnumerables в моем ViewModel называемых Members:

@model example.ViewModels.ClaimModel 

<div class="table list-group "> 
    <div class="row table-bordered "> 
     <div class="pull-left col-xs-1 h5"> 
      Claim ID: 
     </div> 
     <div class="pull-left col-xs-2 h5"> 
      Member Name: 
     </div> 
     <div class="pull-left col-xs-2 h5"> 
      Member ID: 
     </div> 

    </div> 

    @foreach (var item in Model.Members) 
    { 

     <div class="pull-left col-xs-1 h5"> 
      @Html.DisplayFor(modelItem => item.ClaimID) 
     </div> 
     <div class="pull-left col-xs-2 "> 
      @Html.DisplayFor(modelItem => item.Name) 
     </div> 
     <div class="pull-left col-xs-2 "> 
      @Html.DisplayFor(modelItem => item.MemberID) 
     </div> 

    } 

</div> 

Это обычный способ петли через один из IEnumerables. Конечно, мне не нужен ViewModel для этого, потому что я мог бы просто передать мои члены IEnumerable прямо в мой взгляд.

Теперь, какую логику я должен применять для отображения данных из трех разных IEnumerables в столбцы одной и той же строки? Я предполагаю, что это возможно с бритвой.

мне нужно что-то вроде этого:

@model example.ViewModels.ClaimModel 

<div class="table list-group "> 
    <div class="row table-bordered "> 
     <div class="pull-left col-xs-1 h5"> 
      Member Name: 
    </div> 
    <div class="pull-left col-xs-2 h5"> 
     Claim Name: 
    </div> 
    <div class="pull-left col-xs-2 h5"> 
     ID Name: 
    </div> 
</div> 

@foreach (var item in Model.Members) 
{ 
    <div class="pull-left col-xs-1 h5"> 
     @Html.DisplayFor(modelItem => item.Name) 
    </div> 
} 
@foreach (var item in Model.Claims) 
{ 
    <div class="pull-left col-xs-1 h5"> 
     @Html.DisplayFor(modelItem => item.Name) 
    </div> 
} 
@foreach (var item in Model.IDs) 
{ 
    <div class="pull-left col-xs-1 h5"> 
     @Html.DisplayFor(modelItem => item.Name) 
    </div> 
} 

Однако это не будет вставлять свои переменные в одних и те же строки, но стек все имена членов рядом друг с другом и так далее.

Здесь я добавлю комментарий, каждый Claim имеет Member и ID. Claim имеет первичный ключ ClaimID и Member и ID относятся к нему с помощью внешних ключей, называемых ClaimID.

+0

Как эти модели связаны друг с другом? Вы хотите, чтобы первая строка отображала значения для первого «Претензии» и «Первый» и «Идентификатор»? Все ли коллекции одинаковой длины? –

+0

Да, 'Claim' имеет' Member' и 'ID'. Претензия имеет первичный ключ с именем' ClaimID', а 'Member' и' ID' связаны с ним с помощью внешних ключей, называемых 'ClaimID'. – 6134548

+1

Тогда вам будет намного лучше используя модель представления с одной коллекцией на свойство, которое объединяет данные. –

ответ

2

Предполагая, что все три коллекции имеют одинаковое количество элементов, и вы хотите показать n-й элемент во всех списках в n-й строке таблицы в 3 столбцах, это должно сработать.

<table class="table table-striped"> 
    @{ var rowCounter = 0;} 
    @foreach (var item in Model.Members) 
    { 
     <tr> 
      <td> 
       @item.Name 
      </td> 
      <td> 
       @if (Model.Claims.Count()>= rowCounter) 
       { 
        <span>@Model.Claims[rowCounter].Name</span> 
       }  
      </td> 
       <td> 
       @if (Model.IDs.Count()>= rowCounter) 
       { 
        <span>@Model.IDs[rowCounter].Name</span> 
       } 
      </td> 

     </tr> 
     rowCounter++; 
    } 
</table> 

В то время как это решить вашу проблему, я настоятельно рекомендую вам изменить свой подход. Вы должны присоединиться к своему контроллеру и отправить список элементов со всеми этими 3 свойствами и сделать простой цикл и отобразить в вашем режиме бритвы.

Так создать модель представления для представления данных сетки

и в методе действия, присоединиться три набора данных и проецировать необходимые результаты коллекцию этого класса и отправить к просмотру

var list = new List<ClaimRecord>(); 
//to do: Add items to the list here 
// I don't know the relation between these 3 data sets. So i can't tell yo how to do that. 
// But basically, if you have forign key relationship or so, you need to do a join 
return View(list); 

и на ваш взгляд

@model List<ClaimRecord> 
<table> 
@foreach(var item in Model) 
{ 
    <tr> 
    <td>@item.Id</td> 
    <td>@item.ClaimName</td> 
    <td>@item.MemberName</td> 
    </tr> 
} 
</table> 

EDIT: Согласно комментарию.

Претензия имеет первичный ключ с именем ClaimID, а член и идентификатор связаны с ним с помощью внешних ключей под названием ClaimID.

Вы можете присоединиться к своему выражению LINQ.

var list = (from a in db.Claims 
    join b in db.Members on a.ClaimID equals b.ClaimID 
    join c in db.IDs on a.ClaimID equals c.ClaimID 
    select new ClaimRecord { 
          Id = a.ClaimID, //Update these as needed 
          MemberName = b.MemberName, 
          ClaimName = a.ClaimName }).ToList(); 

return View(list); 

Пожалуйста, обновите Выступающую часть с именами свойств. (Мой код предполагает, что таблицы члена/Entity имеет столбец MemberName/собственность и претензия таблица имеет свойство ClaimName. Обновите эту часть в соответствии с вашими потребностями.

+0

О, я отложил свой предыдущий комментарий, так как я не видел вашего обновления. Позвольте мне взглянуть на то, что здесь сейчас спасибо :) – 6134548

+0

Я отправил образец соединения LINQ. Обновите имена свойств по мере необходимости в соответствии с именами столбцов таблицы, – Shyju