首页 > 解决方案 > ASP.Net MVC:如何使用 List ViewData 对象或从控制器传递到视图的其他复杂对象

问题描述

我正在尝试从视图访问在控制器中创建的视图模型对象列表。我知道我必须非常接近,但我不太确定如何访问它。

索引.cshtml


@model IEnumerable<CovidAppV5.ViewModel.COVIDvm>

@{
    ViewBag.Title = "Index";
    var VMlist = ViewData["VMlist"];
    WebGrid grid = new WebGrid(VMlist, canSort: true, canPage: true, rowsPerPage: 5);
}
<meta name="viewport" content="width=device-width" />

<h2>Report</h2>

<table class="table" id="resultTable">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Phone1)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.OrgNumber)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.UnableToTelework)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.CaringForMinor)
        </th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Phone1)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.OrgNumber)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.UnableToTelework)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CaringForMinor)
            </td>
        </tr>
    }
</table>

<div>
    @grid.GetHtml()
</div>

控制器

public ActionResult Index(string Name, string Phone1)
        {
            //System.Diagnostics.Debug.WriteLine(Phone1);

            List<COVIDvm> VMlist = new List<COVIDvm>(); // to hold list of forms

            var covidQuery = (from form in db.Case_Log
                              where form.Name == Name
                              join eForm in db.Emergency_Leave on form.Name equals eForm.Name
                              select new {form.Name, form.Phone1, eForm.OrgNumber, eForm.UnableToTelework, eForm.CaringForMinor}).ToList();
         

            foreach (var item in covidQuery)
            {
                COVIDvm objcvm = new COVIDvm(); // ViewModel
                objcvm.Name = item.Name;
                objcvm.Phone1 = item.Phone1;
                objcvm.OrgNumber = item.OrgNumber;
                objcvm.UnableToTelework = item.UnableToTelework;
                objcvm.CaringForMinor = item.CaringForMinor;
                VMlist.Add(objcvm);
            }
            ViewData["VMlist"] = VMlist;
            return View();
        }

而且我不确定你是否需要它,但如果你在这里需要它,那就是 COVIDvm:

新冠病毒

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace CovidAppV5.ViewModel
{
    public class COVIDvm
    {
        //All from questionaires

        public string Name { get; set; }
        public string Phone1 { get; set; }
        public string Phone2 { get; set; }
        [Column("Division/District")]
        public string Division_District { get; set; }
        public string OrgNumber { get; set; }
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
        public System.DateTime DateOfTest { get; set; }
        public string DateOfExposure { get; set; }

        //All from Emergency Leave
        public bool UnableToTelework { get; set; }
        public bool CaringForMinor { get; set; }
        public bool SpecialCircumstance { get; set; }
        public double Annual { get; set; }
        public double PaidSick { get; set; }
        public double EmergencyPaidSick { get; set; }
        public double Unpaid { get; set; }
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
        public System.DateTime LeaveFrom { get; set; }
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
        public System.DateTime LeaveTo { get; set; }

        //All from Family Leave
        public bool QuarantineOrder { get; set; }
        public bool AdviseToSelfQuarantine { get; set; }
        public bool Symptoms { get; set; }
        public bool CaringForPerson { get; set; }
        public bool ChildCareUnavailable { get; set; }
        public bool SimilarConditions { get; set; }
    }
}

我很确定在 MVC 中,如果您没有指定您尝试使用的视图数据对象的类型(我现在没有这样做),那么它会尝试使用字符串类型,这显然会给我带来错误。所以我需要定义VMlist是什么类型的对象,但是我尝试了几种不同的想法都无济于事。我认为它需要类似var VMlist = ViewData["VMlist"] as List<COVIDvm>; 或类似的东西,但这不起作用。

您可能还会注意到,这会在视图上引发一些错误:WebGrid grid = new WebGrid(VMlist, canSort: true, canPage: true, rowsPerPage: 5); 然后稍后再使用它:<div> @grid.GetHtml()</div>因为我不确定 VMlist 是否是可接受的数据源,即使我在视图中正确地拥有了对象。不过,我对此可能是错的,但这不是问题的主要关注点。主要问题是将对象从控制器传递到视图。

例如,如果我想将 LINQ 查询结果covidQuery从控制器传递到视图怎么办?那可能吗?

标签: c#asp.net-mvcviewcontroller

解决方案


主要问题是将对象从控制器传递到视图。

您正在使用动态方法...我建议在 ViewData 上使用类型化方法。查看下面的代码更改,看看是否有帮助。

例如,如果我想将 LINQ 查询结果 covidQuery 从控制器传递到视图怎么办?那可能吗?

是的你可以。确保传递与 IEnumerable/ICollection 兼容的类型与传回 LINQ IQueryable 类型(下面的示例执行此操作)。

public ActionResult Index(string Name, string Phone1)
        {   
            var VMlist = new List<COVIDvm>(); // to hold list of forms

            var covidQuery = (from form in db.Case_Log
                              where form.Name == Name
                              join eForm in db.Emergency_Leave on form.Name equals eForm.Name
                              select new {form.Name, form.Phone1, eForm.OrgNumber, eForm.UnableToTelework, eForm.CaringForMinor}).ToList();
         

            foreach (var item in covidQuery)
            {
                COVIDvm objcvm = new COVIDvm(); // ViewModel
                objcvm.Name = item.Name;
                objcvm.Phone1 = item.Phone1;
                objcvm.OrgNumber = item.OrgNumber;
                objcvm.UnableToTelework = item.UnableToTelework;
                objcvm.CaringForMinor = item.CaringForMinor;
                VMlist.Add(objcvm);
            }
            
            return View(VMList);
        }

编辑- 以下是您将 covidQuery 结果直接发送到视图的方式(解决您的第三条评论)

public ActionResult Index(string Name, string Phone1)
        {   
            //var VMlist = new List<COVIDvm>(); // to hold list of forms

            var covidQuery = (from form in db.Case_Log
                              where form.Name == Name
                              join eForm in db.Emergency_Leave on form.Name equals eForm.Name
                              select new {form.Name, form.Phone1, eForm.OrgNumber, eForm.UnableToTelework, eForm.CaringForMinor}).ToList();
         
            // ommitted previous code - add whatever else needed here
    
            return View(covidQuery);
        }

推荐阅读