在我的控制器中,我返回一个列表,它是连接两个表的结果。现在我想将此列表传递到我的视图,但无法执行此操作。出现这样的错误:
System.Collections.Generic.List1[<>f_AnonymousType2[System.String、System.String、System.String…etc],而此字典需要类型为System.Collections.Generic.IENumberable[XYZ.Models.MyModelTable].的元素
public ActionResult someAction()
{
BASEdb db = new BASEdb();
var model = db.MyModelTable
.Join(db.Customers,
z => z.FOPKTO_, k => k.ID,
(z, k) => new { FOPKTO = z, Customers = k })
.Where(w => w.FOPKTO.Date == null)
.Select(s => new
{
s.Customers.Name,
s.MyModelTable.FOPKTO,
s.MyModelTable.FOPBDA,
s.MyModelTable.FOPGSS,
})
.ToList();
return View(model);
}
以及我的观点:
@model IEnumerable<XYZ.Models.MyModelTable>
@{
ViewBag.Title = "Invoices";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Invoices</h2>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.FOPBDA)
</th>
<th>
@Html.DisplayNameFor(model => model.FOPLBN)
.... etc. (there's foraeach instruction below as well)
如何将返回两个表中数据的列表传递给View?我的视图现在采用一个表的类型(MyModelTable(?我认为它应该是更通用的类型,但不知道如何绕过
您应该为视图创建一个ViewModel
。这将是您的视图专门使用的数据结构,也可以是其他两个模型的组合结构。
网上有很多信息,这里有一个来自StackOverflow的例子:
MVC中的ViewModel是什么?
按照您的方式,您不是在创建IEnumerable<XYZ.Models.MyModelTable>
(视图中预期的类型(,而是在创建一个匿名类型列表。
让我们称之为MyViewModel
。你可以这样声明:
public class MyViewModel(){
public string Name {get;set;}
public int FOPKTO {get;set;}
public int FOPBDA {get;set;}
public int FOPGSS {get;set;}
}
然后在你的控制器中,将其构建为:
var model = db.MyModelTable
.Join(db.Customers,
z => z.FOPKTO_, k => k.ID,
(z, k) => new { FOPKTO = z, Customers = k })
.Where(w => w.FOPKTO.Date == null)
.Select(s => new MyViewModel
{
Name = s.Name,
FOPKTO = s.FOPKTO,
FOPBDA = s.FOPBDA,
FOPGSS = s.FOPGSS
})
.ToList();
return View(model);
然后更新视图以使用此视图模型而不是以前的模型。
这只是猜测,因为您没有显示MyModelTable
类,但您可能需要执行以下操作:
var models = db.MyModelTable
.Join(db.Customers,
z => z.FOPKTO_, k => k.ID,
(z, k) => new { FOPKTO = z, Customers = k })
.Where(w => w.FOPKTO.Date == null)
.Select(s => new MyModelTable
{
Name = s.Customers.Name,
FOPKTO = s.MyModelTable.FOPKTO,
FOPBDA = s.MyModelTable.FOPBDA,
FOPGSS = s.MyModelTable.FOPGSS,
})
.ToList();
创建一个类似MyViewModel的ViewModel类型。
public class MyViewModel(){
public string Name { get; set; }
public int FOPKTO { get; set; }
public int FOPBDA { get; set; }
public int FOPGSS { get; set; }
}
并选择它以列出。
BASEdb db = new BASEdb();
var model = db.MyModelTable
.Join(db.Customers,
z => z.FOPKTO_, k => k.ID,
(z, k) => new { FOPKTO = z, Customers = k })
.Where(w => w.FOPKTO.Date == null)
.Select(s => new MyViewModel
{
Name = s.Customers.Name,
FOPKTO = s.MyModelTable.FOPKTO,
FOPBDA = s.MyModelTable.FOPBDA,
FOPGSS = s.MyModelTable.FOPGSS
})
.ToList();
return View(model);
并将视图模型类型更改为MyViewModel
@model IEnumerable<MyViewModel>
... etc
简而言之,创建一个模型类。定义该模型中的属性。在控制器操作中填充该模型类的实例,然后返回视图。。。易于理解的
请不要忘记将其作为答案:(谢谢