2016-02-25 2 views
0

У меня есть следующий индекс-метод в моем HomeController:Pass ViewModel для просмотра дважды

var homeIndexModel = new HomeIndexModel() 
    { 
     ActiveTasks = tasks.Where(
      task => 
       task.TaskStatus != TaskStatusEnum.Deferred && 
       task.TaskStatus != TaskStatusEnum.Verified && task.TaskStatus != TaskStatusEnum.Resolved), 
     ClosedTasks = tasks.Where(
       task =>        
        task.TaskStatus == TaskStatusEnum.Resolved), 
     DeferredTasks = tasks.Where(
      task => 
       task.TaskStatus == TaskStatusEnum.Verified || 
       task.TaskStatus == TaskStatusEnum.Deferred), 
     Rules = m_errandSvc.GetAllRules(), 
     Sources = 
      Enum.GetValues(typeof(TaskSourceEnum)).Cast<TaskSourceEnum>().AsEnumerable().OrderBy(taskSource => taskSource.AsString()), 
     Types = 
      Enum.GetValues(typeof(TaskTypeEnum)).Cast<TaskTypeEnum>().AsEnumerable().OrderBy(taskSource => taskSource.AsString()), 
     Counties = counties, 
     Reports = null, 
    }; 

    return this.View(homeIndexModel); 

Это homeIndexModel передается в виду, когда вы посещаете Firstpage. Как вы можете видеть, я объявляю объект Report-null равным null.

Я хочу использовать это Report-свойство homeIndexModel, когда я выполняю поиск На первой странице. Когда я нажимаю «Поиск», появляется модальный текст и результат поиска распечатывается.

Вот мой поиск-метод в контроллере:

[HttpPost] 
     public ActionResult SearchReport(string searchVal, string searchParam) 
     { 
      var reports = m_errandSvc.GetReportSearch(searchVal, searchParam).ToList(); 
      var homeIndexModel = new HomeIndexModel() 
      { 
       Reports = reports 
      }; 
      return this.View(homeIndexModel); 
     } 

Как вы можете видеть, я assaign в отчет-свойство с результатом GetReportSearch. Я хочу перебрать этот объект ниже:

<!-- Modal --> 
<div class="modal" id="myModalSearch" aria-hidden="true" data-keyboard="false" data-backdrop="static"> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
      <div class="modal-body"> 
       <div class="panel panel-default"> 
        <div class="panel-heading"> 
         <h4>FISH</h4> 
         @if (Model.Reports != null) 
         { 

         } 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

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

@if (Model.Reports != null) 
    { 
     foreach(var itm in Model.Reports) 
     { 
      <div>@itm.Report_id</div> 
      <div>@itm.ReportSource</div> 
     } 
    } 

Как я могу решить эту целую вещь с homeIndexViewModel и распечатать мой поиск результата, как я хочу?

Herer мой JQuery, который я использую, чтобы получить возможность отправлять к поиску методу:

$('#searchReports').click(function() { 

     var searchVal = $('#searchVal').val(); 

     $.ajax({ 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      type: "POST", 
      url: DataReview.BASE + "/Home/SearchReport", 
      data: JSON.stringify(
       { 
        'searchVal': searchVal, 
        'searchParam': searchParam 
       } 
      ) 
     }).done(function (data) { 
      console.log("YES"); 
     }).fail(function(data) { 
      console.log("Fail " + data); 
     }); 
    }); 
+0

Конечно, это не войдет в цикл, поскольку 'Model.Reports' является недействительным в своем действии – Imad

+0

Но после моего поиска? Я хочу, чтобы Он появился после моего поиска. – Bryan

+0

любезно описать структуру проекта – Imad

ответ

0

Передайте назад модель представления снова на поиске, а затем назначить отчет ему этот путь.

[HttpPost] 
     public ActionResult SearchReport(string searchVal, string searchParam, HomeIndexModel homeIndexModel) 
     { 
      var reports = m_errandSvc.GetReportSearch(searchVal, searchParam).ToList(); 

      homeIndexModel.Reports = reports  

      return this.View(homeIndexModel); 
     } 

Или лучше всего вы можете сделать вызов Ajax, а затем получить только данные отчетов и обновить страницу просмотра. Но для этого требуется JQuery, дайте мне знать, если вы хотите помочь в реализации этого.

EDIT 1: Внесите небольшие изменения в код, чтобы получить эту работу от ajax.

$.ajax({ 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      type: "POST", 
      url: DataReview.BASE + "/Home/SearchReport", 
      data: JSON.stringify(
       { 
        'searchVal': searchVal, 
        'searchParam': searchParam 
       } 
      )   
     }) 
     .done(function (reportData) {    
      var $panelHeading = $('#myModalSearch .panel-heading'); 
      $('#myModalSearch .panel-heading').contents(':not(h4)').remove(); //remove previous search results 
      $.each(reportData, function(i,v){    
       $panelHeading.append("<div>"+this.Report_id+"</div<div>"+this.ReportSource+"</div>"); //append new result 
      }); 

     }) 

Ваш контроллер должен возвращать JSON, а не вид, поэтому измените код ниже.

[HttpPost] 
    public ActionResult SearchReport(string searchVal, string searchParam) 
    { 
     var reports = m_errandSvc.GetReportSearch(searchVal, searchParam).ToList(); 

     return Content(new JavaScriptSerializer().Serialize(reports), "application/json"); 
    } 
+0

Это не работает. Foreach. По моему мнению, мое приложение отключается. – Bryan

+0

Не уверен, что заставляет ваше приложение закрываться, Но почему вы не используете ajax для таких реализаций? –

+0

Я использую jQuery для отправки в действие SearchReport. Как я должен возвращать данные и просматривать отчеты в представлении с помощью Ajax? – Bryan

Смежные вопросы