【问题标题】:ASP.Net MVC: How to use a List ViewData object or other complex objects passed from a controller to a viewASP.Net MVC:如何使用 List ViewData 对象或从控制器传递到视图的其他复杂对象
【发布时间】:2021-02-17 17:42:33
【问题描述】:

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

Index.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&lt;COVIDvm&gt;; 或类似但不起作用的东西。

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

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

【问题讨论】:

  • 见下文:forums.asp.net/t/…
  • @jdweng 在这一行的答案中:var grid = new WebGrid(source: (List&lt;Tuple&lt;int, string, int&gt;&gt;)ViewBag.grid1, canPage: true, canSort:false, rowsPerPage: 17); 我用什么代替List&lt;Tuple&lt;int, string, int&gt;&gt;? Visual Studio 推荐这个:source: (List&lt;CovidAppV5.ViewModel.COVIDvm&gt; ,这在技术上是可行的,但它会显示整个 View Model 而不仅仅是 VMlist。
  • 做以下工作:List 你得到一个数据集,你只想要一个数据集。
  • 不,列表错误:Generic type 'List&lt;T&gt;' requires 1 type arguments. 和 CovidAppV5 错误:CovidAppV5 is a namespace but is used like a variable 。最后,由于某种原因,Viewbag 不再喜欢括号:syntax error ',' expected

标签: c# asp.net-mvc view controller


【解决方案1】:

主要关注点是将对象从控制器传递到 查看。

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

如果我想从 例如,控制器到视图?这可能吗?

是的,你可以。确保传递与 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);
        }

【讨论】:

  • 您提供的代码实际上是我尝试的第一种方法。不幸的是,在使用了你这里的代码后,我在视图中得到了这一行的错误 ``` var grid = new WebGrid(VMlist, canSort: true, canPage: true, rowsPerPage: 5); ````错误消息:````名称VMlist在当前上下文中不存在`````。另外,我正在使用动态方法,这是有意的。现在我确实有一组 VMlist 的参数,但是一旦我让这个示例在未来工作,VMlist 不仅会有可变数量的属性,而且属性本身也是可变的。
  • 为了澄清最后的评论,未来 VMlist 可能包括 Name、Phone1 和 OrgNumber,但没有更多属性。它可能还具有比此处示例更多的属性。所以属性的数量和属性本身都会改变;因此这必须动态完成。
  • 另外,我不确定我是否理解您的回答,因为我曾询问是否可以将 covidQuery 发送到您回答是的视图并在那里访问它......但后来没有这样做在代码示例中。您使用了 VMlist 并没有对 covidQuery 做任何不同的事情。对不起,我不明白。
  • 不确定您是否了解此处的 asp.net 功能。 ViewData 是一种动态数据结构。我通过将具体对象传递给视图所建议的方法不是。您指的是拥有一个动态数据对象(如 JS),您可以通过使用 C# 动态关键字声明动态类型来做到这一点。这超出了我上面回答的原始问题的范围。此外,WebGrid 也是一个不同的问题。我从您的 OP 中引用了您的两个问题并回答了这些问题,因为这就是所要求的。您可能应该为 WebGrid 开始第二个 SO 问题。
  • 我不确定你是否理解我的 cmets 哈哈。也许我说得不够清楚。感谢您花时间尝试回答,我很感激。
猜你喜欢
  • 2014-10-22
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多