【发布时间】:2016-05-12 02:28:10
【问题描述】:
我一直在研究一个 MVC ViewModel,它包含我需要传递给 View(而不是使用 ViewBags)的标量数据值,以及一个包含表中表格数据的 IEnumerable。这是基于某人对较早的 SO 问题提出的建议。这样,如果我将标量值作为常量添加到可能有很多行的表中,就不会出现重复。
我正在粘贴我的(简化的)数据模型和视图模型定义以及有问题的控制器操作。数据结构是我需要的,但 Visual Studio 不会从此操作创建视图(右键单击并选择“使用模型添加视图”)。
我的问题是,给出了动作和模型定义,我需要做什么才能创建视图模型的视图?
我认为自动脚手架是不可能的,因为 ViewModel 没有键,所以我期待手动编码。我不知道该怎么做,因为我看到的所有示例都显示 ViewModel 本质上相当于将两个表合并为一个更大的表。
我尝试过使用@model = [ViewModelName] 和@model = IEnumerable,但都失败了。
二进制响应是,“呃,错误告诉你到底发生了什么。你没有钥匙。”但这种反应并不能帮助我解决这个问题。我该如何继续这个 ViewModel 的定义并创建一个视图?
查看模型
public class StudentRosterViewModel
{
// This list is the "table" shown on the view
public IEnumerable<StudentRoster> StudentRosters { get; set; }
// These are scalar values apply to the view as a whole
public string SelectedCampus { get; set; }
public string SelectedFiscalYear { get; set; }
}
数据模型
[Table("StudentRoster")]
public partial class StudentRoster
{
public int ID { get; set; }
[Required]
[StringLength(3)]
public string Campus { get; set; }
[Required]
[StringLength(4)]
public string FiscalYear { get; set; }
[Required]
[StringLength(50)]
public string StudentName { get; set; }
public int StudentID { get; set; }
}
控制器动作:
public ActionResult FilterableIndex(string campus="MRA",string fiscalYear = "FY16")
{
StudentRosterViewModel vm = new StudentRosterViewModel();
// this is tabular data and goes in the "table"
vm.StudentRosters = db.StudentRosters
.Where(m => m.Campus == campus)
.Where(m => m.FiscalYear == fiscalYear)
.ToList();
// These are scalar values; they are not tabular
// These are needed to supply values to jQuery
vm.SelectedCampus = campus;
vm.SelectedFiscalYear = fiscalYear;
return View(vm);
}
【问题讨论】:
-
操作你的“FilterableIndex”,它是 HttpPost 或 Get,使用 json 或来自的请求
-
您将
StudentRosterViewModel的实例传递给视图,因此视图需要@model StudentRosterViewModel,然后生成您的表@foreach(var item in Model.StudentRosters) { .... -
请注意,它必须是
return View(vm);才能将模型返回到视图。 -
@StephenMuecke -- 你在另一个迭代中抓住了我,我之前有 View(vm) 在那里......
-
@Rubix_Revenge 我认为您的错误是您没有为 tableModel 设置密钥,您需要在属性 public int ID { get; 上添加属性“[Key]”放; }
标签: c# asp.net asp.net-mvc asp.net-mvc-viewmodel