我正在开发一个简单的项目,我在两个表中有数据,我需要从控制器返回到我的View。我知道在.NET中有两种方法可以做到这一点,第一种方法是创建一个模型类,添加你需要在视图中访问的属性,实质上是创建一个ViewModel。像这样:
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并使用您需要发送到视图的属性加载它,然后将模型返回到View,如下所示:
//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查询中连接两个表,选择需要发送到匿名对象中的View的属性并返回视图,如下所示:
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 *
的内容?然后,每次更改模型时,我都不必将属性添加到控制器中。
答案 0 :(得分:2)
在视图中传递匿名类型时看一些问题:
1.创建一个将传递匿名类型的控制器。
public ActionResult Index()
{
return View(new { TestProperties="This is a test properties."});
}
2。检查数据是否在视图中发送。
@Model
3。现在,让我们访问我们在视图中发送的匿名类型的属性。
@Model.TestProperties
现在让我们为ViewModel创建一个POCO类。