如何将列表(sql联接)传递到c#中查看



在我的控制器中,我返回一个列表,它是连接两个表的结果。现在我想将此列表传递到我的视图,但无法执行此操作。出现这样的错误:

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

简而言之,创建一个模型类。定义该模型中的属性。在控制器操作中填充该模型类的实例,然后返回视图。。。易于理解的

请不要忘记将其作为答案:(谢谢

最新更新