C# NET MVC中的LINQ:创建ViewModel与连接表相比有什么优势吗?
我正在做一个简单的项目,其中有两个表中的数据,需要从控制器返回到视图。我知道在.NET中有两种方法可以做到这一点,第一种是创建一个模型类,添加需要在视图中访问的属性,本质上是创建一个ViewModel。像这样:C# NET MVC中的LINQ:创建ViewModel与连接表相比有什么优势吗?,c#,linq,select,viewmodel,asp.net-mvc-viewmodel,C#,Linq,Select,Viewmodel,Asp.net Mvc Viewmodel,我正在做一个简单的项目,其中有两个表中的数据,需要从控制器返回到视图。我知道在.NET中有两种方法可以做到这一点,第一种是创建一个模型类,添加需要在视图中访问的属性,本质上是创建一个ViewModel。像这样: public class BeerListViewModel { public int Id { get; set; } public string Name { get; set; } public string BrewerName { get; se
public class BeerListViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string BrewerName { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string WebUrl { get; set; }
public string ImageUrl { get; set; }
public double AlcoholContent { get; set; }
public string BeerType { get; set; }
public int Calories { get; set; }
public double Carbs { get; set; }
public string Notes { get; set; }
public int CountofReviews { get; set; }
}
然后将您的模型设置为LINQ语句,选择DbSet并实例化ViewModel,并使用需要发送到视图的属性加载它,然后将您的模型返回到视图,如下所示:
//1. Instantiate the db
OdeToBeerDb _db = new OdeToBeerDb();
// GET: Reviews
public ActionResult Index()
{
var model = from b in _db.Beers
orderby b.Name ascending
select new BeerListViewModel
{
Id = b.Id,
Name = b.Name,
BrewerName = b.BrewerName,
BeerType = b.BeerType,
ImageUrl = b.ImageUrl,
City = b.City,
Notes = b.Notes,
AlcoholContent = b.AlcoholContent
};
return View(model);
}
使用另一种方法,只需在LINQ查询中连接两个表,选择需要发送到匿名对象中的视图的属性并返回视图,如下所示:
public class ReviewsController : Controller
{
//1. Instantiate the db
OdeToBeerDb _db = new OdeToBeerDb();
// GET: Reviews
public ActionResult Index()
{
var model = from b in _db.Beers
join r in _db.Reviews on b.Id equals r.BeerId
orderby b.Name ascending
select new
{
Id = b.Id,
Name = b.Name,
BrewerName = b.BrewerName,
BeerType = b.BeerType,
ImageUrl = b.ImageUrl,
City = b.City,
Notes = b.Notes,
AlcoholContent = b.AlcoholContent
};
return View(model);
}
我想知道的是:为什么我要费心创建一个ViewModel,将其他类的属性复制并粘贴到其中,然后实例化ViewModel?这样做似乎有点多余,而不是仅仅加入表格,或者我缺少了一些优势?是的,我知道它是强类型的,并且创建ViewModel命名对象,但是我必须将属性添加到该类中,那么如果我将它们添加到类或控制器中会有什么区别呢?就这一点而言,LINQ中是否存在与
SELECT*
等效的代码?这样,我就不必每次更改模型时都将属性添加到控制器中。查看在视图中传递匿名类型时出现的一些问题:
1.创建将传递匿名类型的控制器
public ActionResult Index()
{
return View(new { TestProperties="This is a test properties."});
}
二,。检查是否在视图中发送数据
@Model
三,。现在让我们访问视图中发送的匿名类型的属性
@Model.TestProperties
访问匿名类型的属性时,我们将遇到以下错误:
现在,让我们为ViewModel创建一个POCO类
现在,ViewModel的价值可以是使用Razor语法访问和创建文本框。我明白你的意思,以前去过,但试着这样想。。。。也许有帮助,也许没有。在ViewModel中包含DB类,而不是为每个属性创建ViewModel属性。这样,视图模型只是一个容器。您的db访问应该是分层的,即不在控制器中…无论如何。。假设在视图中显示“啤酒”创建视图模型啤酒IndexviewModel包含属性列表啤酒填充时,告诉EF“包含”评论。然后你的任务完成了。以上这些都不是你的错,这里已经有答案了。这看起来是多余的,但最终这带来了这里提到的多个优点。有用的元反馈:我刚刚在这里标记了一条评论,关于投票否决是网络欺凌的一个例子,它会自动删除(有一个未发布的算法,意味着一些评论在标记时会自动删除)。我还从另一个问题中删除了一些关于投票和语气的元评论。一般来说,如果您对堆栈溢出有强烈的预期,最好不要事先对其进行评论。这主要是因为这样做可能会矛盾地导致强烈的反应,因此它会引发你试图避免的事情。这是不幸的,但试图控制这种人类现象可能是徒劳的。在任何情况下,我们都希望帖子不要带有不相关的元评论——Stack Overflow的大多数读者没有账户,也没有登录,他们只想阅读简洁明了的材料。在发布问题时,从心理学的角度来看,对任何形式的投票持开放态度是非常有帮助的,包括近距离投票和向下投票。有人花时间帮助策划网站的这些行动通常是值得称赞的——这就是为什么Stack Overflow被认为是目前世界上质量最高的科技问答网站之一。大体上,我认为不支持投票的人不值得评论——他们是匿名的,所以问他们为什么这样做是不值得的,因为选民已经离开了。如果他们想提供评论反馈,他们会这样做的。