c# - 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
从控制器传递到视图怎么办?那可能吗?
解决方案
主要问题是将对象从控制器传递到视图。
您正在使用动态方法...我建议在 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);
}
推荐阅读
- rust - 如何以线程安全的方式重置 Arc?
- python - 无法返回并插入 pandas 列(EMPTY SPACE)
- android - 如何将生成的第一个编辑文本集中在 ArrayList 上
并在填充后点击 Kotlin 中的文本视图转到下一个 - android - TextView 多行文本行高
- reactjs - 为什么我的所有列表项的状态都在改变,而不仅仅是一个?React.js,状态,HandleChange,模态
- python - 我可以在 OneDrive / Sharepoint 中创建未过期的令牌吗?
- express - 使用 API 在 Vercel 上部署 Nuxt JS
- web-services - 您可以从 Google Places API 查询中返回多个营业地点吗?
- error-handling - 为什么不能用?(问号)直接在 Rust 中的 collect() 上?
- excel - 加快跨多个工作表VBA的复制/粘贴