2016-09-13 4 views
0

У меня есть страница с информацией, я хочу добавить туда список (в виде таблицы) в частичном представлении. Пользователь должен иметь возможность сортировать его, переключая радиоканал.Как показать частичный вид

Моя проблема: код работает нормально (я попытался в отдельном виде), но когда я пытаюсь переключить переключатель (они отправляют страницу на изменение и активируют второй метод, который создает новую модель в соответствии с переключателем) i получить html-код только с моего частичного представления.

Другими словами:
я хочу: HTML от view1 + HTML из myPartial
я получаю: только HTML от myPartial
Я полагаю, проблема здесь (вызов мой myPartial):

@Html.Action("_ShowEmployeeProjects", "Employee") 

Но когда я пытаюсь это использовать:

@Html.Partial("Partial/_ShowEmployeeProjects") 

Я получаю t его:

Модели элемент передается в словарь типа
«BTGHRM.Models.EmployeeJobDataViewModel», но этот словарь требует модельного элемента типа «System.Collections.Generic.List`1 [ BTGHRM.Models.EmployeeProjectHistoryModel].

Мои контроллеры Код:

public PartialViewResult _ShowEmployeeProjects() 
    { 
     int EmpId = HRMSession.SelectedEmployeeId; 

     using (var db = new HRMEntities()) 
     { 
      List<EmployeeProjectHistoryModel> list = (from t1 in db.ProjectWorkers 
                 join t2 in db.Projects 
                 on t1.ProjectId equals t2.ProjectId 
                 where (t1.WorkerId == EmpId && t1.IsActive == true) 
                 select new EmployeeProjectHistoryModel() 
                 { 
                  ProjectName = t2.ProjectName, 
                  Activity = t1.Activity, 
                  StartDate = t1.StartDate, 
                  EndDate = t1.EndDate 
                 }).ToList(); 
      return PartialView("Partial/_ShowEmployeeProjects",list); 
     } 
    } 
    [HttpPost] 
    public PartialViewResult _ShowEmployeeProjects(string ActiveOnlySelect) 
    { 
     int EmpId = HRMSession.SelectedEmployeeId; 
     List<EmployeeProjectHistoryModel> list; 
     using (var db = new HRMEntities()) 
     { 
      if (ActiveOnlySelect.Equals("both")) 
      { 
       list = (from t1 in db.ProjectWorkers 
         join t2 in db.Projects 
         on t1.ProjectId equals t2.ProjectId 
         where (t1.WorkerId == EmpId) 
         select new EmployeeProjectHistoryModel() 
         { 
          ProjectName = t2.ProjectName, 
          Activity = t1.Activity, 
          StartDate = t1.StartDate, 
          EndDate = t1.EndDate 
         }).ToList(); 
       list.OrderBy(x => x.StartDate); 
      } 
      else 
      { 
       list = (from t1 in db.ProjectWorkers 
         join t2 in db.Projects 
         on t1.ProjectId equals t2.ProjectId 
         where (t1.WorkerId == EmpId && t1.IsActive == true) 
         select new EmployeeProjectHistoryModel() 
         { 
          ProjectName = t2.ProjectName, 
          Activity = t1.Activity, 
          StartDate = t1.StartDate, 
          EndDate = t1.EndDate 
         }).ToList(); 
       list.OrderBy(x => x.StartDate); 
      } 
     } 
     return PartialView("Partial/_ShowEmployeeProjects", list); 
    } 

Мой частичный:

@model List<BTGHRM.Models.EmployeeProjectHistoryModel> 
@using (Html.BeginForm("_ShowEmployeeProjects", "Employee", FormMethod.Post, new { type = "main" })) 
{ 
<table> 
    <tr> 
     <td> 
      @Html.RadioButton("ActiveOnlySelect", "activeonly", true, new { id = "ActiveOnlySelect0", onchange = "this.form.submit();" }) 
      <label for="ActiveOnlySelect0">@Resources.Localization.show_only_actual</label> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      @Html.RadioButton("ActiveOnlySelect", "both", new { id = "ActiveOnlySelect1", onchange = "this.form.submit();" }) 
      <label for="ActiveOnlySelect1">@Resources.Localization.show_all_data</label> 
     </td> 
    </tr> 
</table> 
} 
@{ 
    WebGrid grid = new WebGrid(Model, canSort: false, rowsPerPage: 15); 
if (Model.Any()) 
{ 

    @grid.GetHtml(
    tableStyle: "table", 
    headerStyle: "table_HeaderStyle", 
    footerStyle: "table_PagerStyle", 
    rowStyle: "table_RowStyle", 
    alternatingRowStyle: "table_AlternatingRowStyle", 
    selectedRowStyle: "table_SelectedRowStyle", 
    columns: grid.Columns(
     grid.Column("ProjectName", Resources.Localization.project, style: "p30"), 
     grid.Column("Activity", Resources.Localization.activity, style: "p30"), 
     grid.Column("StartDate", Resources.Localization.start_date, format: @<text> 
      @if (item.StartDate != null) 
      { 
       <span class="display-mode"><label id="StartDateLabel">@item.StartDate.ToShortDateString()</label></span> 
       @Html.Hidden("Model.StartDate", (object)item.StartDate.ToShortDateString()) 
      } 
      else 
      { 
       <span> &nbsp; </span> 
      }</text>, style: "p10"), 
     grid.Column("EndDate", Resources.Localization.end_date, format: @<text> 
      @if (item.EndDate != null) 
      { 
       <span class="display-mode"><label id="EndDateLabel">@item.EndDate.ToShortDateString()</label></span> 
       @Html.Hidden("Model.EndDate", (object)item.EndDate.ToShortDateString()) 
      } 
      else 
      { 
       <span> &nbsp; </span> 
      }</text>, style: "p10") 
    ) 
    ) 
} 

}

+0

Извините за беспорядочное объяснение. –

+1

Добавьте свой код частичного просмотра, возможно, вы проезжаете модель вместо списка –

+0

@Div В этом случае это не будет работать в отдельном представлении, но okey - опубликовано) –

ответ

1

Похоже, вы передаете неправильную модель на ваш частично. Структура будет:

В вашем основном макете:

@model System.Collections.Generic.List[BTGHRM.Models.your_model] 
<!-- DO YOUR HTML´S STUFF. You can access to your_model.employee´s list --> 
@Html.Partial("Partial/_ShowEmployeeProjects", Model.projects) 

В вашей Partial, помните, чтобы получить модель, которую вы передаете из основного макета:

@model System.Collections.Generic.List[BTGHRM.Models.your_model.projects] 
<!-- DO YOUR HTML´S STUFF --> 

Тогда в вашем контроллер, вы должны вернуть возврат:

[HttpPost] 
    public PartialViewResult _ShowEmployeeProjects(string ActiveOnlySelect) 
    { 
     // DO YOUR MAGIC 
     // model should be a List[BTGHRM.Models.your_model] 
     PartialView("Partial/_ShowEmployeeProjects", model); 
    } 

Модель:

public class your_model 
{ 
    List<Employee> employees; 
    List<Project> projects; 
..... 
} 
+0

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

+1

Вы можете передать в качестве модели список объектов, состоящих из двух атрибутов, списка сотрудников и вашего списка проектов. Я отредактирую свой вопрос, чтобы дать вам идею ... –

+0

IDK, я должен переписать много кода таким образом, я немного подожду, мб кто-то знает разные решения (кстати, я могу просто переместить мой код из частичного представления - это не хорошая практика, которую я знаю - но вся эта страница выглядит странно) –