传递ViewModel以查看两次

时间:2016-02-25 09:54:50

标签: c# asp.net razor

我的homecontroller中有以下索引方法:

    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传递给视图。如您所见,我将Report-object设置为null。

我想在搜索第一页时使用homeIndexModel的Reporte属性。当我点击&#34;搜索&#34;时,应出现一个模态并打印出搜索结果。

这是我在控制器中的搜索方法:

  [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);
        } 

如您所见,我将Report-property与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>

我遇到的问题是,当我添加foreach时,如下所示,我的调试模式退出。

   @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);
        });
    });

1 个答案:

答案 0 :(得分: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调用,然后只获取报告数据并更新View页面。但是这需要 Jquery ,如果您需要帮助来实现这一点,请告诉我。

编辑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而不是视图,因此请将代码更改为低于1。

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

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