现在,我意识到这个问题之前已经得到了回答,但是我无法绕过它并让它在我的例子中发挥作用:
查看
应该包含2个foreach循环fx
foreach(Model.ListA中的var项)
foreach(Model.ListB中的var项目)
模型
应该包含一个带有LinqDataContext对象的类和两个属性:(ListA和ListB)
控制器
应该通过视图传递模型。
模型和控制器如何实现这一目标?
一些简单的代码示例会非常有用:)
答案 0 :(得分:1)
你有点落后了。您的数据上下文应该在控制器中(最好在控制器使用的层中)。您总是希望控制器负责获取/更新数据,并填充模型。然后,模型将传递给视图,其中包含显示该数据所需的所有内容。
public class MyModel
{
public List<ListAEntity> ListA {get;set;}
public List<ListBEntity> ListB {get;set;}
}
public class HomeController : Controller
{
private readonly MyDataContext _context = new MyDataContext();
public ActionResult Index()
{
var model = new MyModel()
{
ListA = _context.Get<ListAEntity>().ToList(),
ListB = _context.Get<ListBEntity>().ToList()
};
return View(model);
}
}
答案 1 :(得分:1)
哇,将一个LinqDataContext填充到一个视图味道很糟糕。你为什么这样做?
控制器应从所述LinqDataContext或后端服务获取所需的所有数据,然后创建一个仅包含IList或IEnumerable的简单ViewModel。
public class YourViewModel
{
public List<A> ListA {get; set;}
public List<B> ListB {get; set;}
}
public ActionResult YourControllerAction()
{
var context = yourDataContext;
var model = new YourViewModel
{
ListA = context.TableA.Where(x => x.Something)
.Select(x => x.ConvertSqlToBusinessObject()).ToList(),
ListB = context.TableB.Where(x => x.Something)
.Select(x => x.ConvertSqlToBusinessObject()).ToList()
};
return View("Index",model);
}
答案 2 :(得分:0)
我会在之前的答案中添加一些小的补充:控制器应该实现选择正确的视图和视图模型所需的逻辑,但它不应该填充视图模型。视图模型完全能够填充自己。
此模式改进了控制器和视图模型的封装,并在关注点之间创建了更清晰的分界。因此,如果我窃取迈克尔的代码片段:
在控制器中
public ActionResult YourControllerAction(){
MyDbContext context = new MyDbContext();
return View("YourControllerAction", new YourViewModel(context));
}
在视图模型中
public class YourControllerAction {
public YourControllerAction(MyDbContext context) {
ListA = context.TableA.Where(x => x.Something).Select(x => x.ConvertSqlToBusinessObject()).ToList();
ListB = context.TableB.Where(x => x.Something).Select(x => x.ConvertSqlToBusinessObject()).ToList();
}
}