MVC中的脚手架会创建如下操作:
var chromeOptions = new Dictionary<string, object>();
List<string> args = new List<string>();
foreach (string ma in myArgs) //yes, myArgs is created beforehand
args.Add(ma);
chromeOptions.Add("args", args);
var options = new Dictionary<string, object>();
var loggingPrefs = new Dictionary<string, object>();
loggingPrefs.Add("PERFORMANCE", "ALL" );
var perfLoggingPrefs = new Dictionary<string, object>();
perfLoggingPrefs.Add("enableNetwork", true);
perfLoggingPrefs.Add("enablePage", true);
perfLoggingPrefs.Add("traceCategories", "toplevel,disabled-by-default-devtools.timeline.frame,blink.console,disabled-by-default-devtools.timeline,benchmark");
options.Add("chromeOptions", chromeOptions);
options.Add("loggingPrefs", loggingPrefs);
options.Add("perfLoggingPrefs", perfLoggingPrefs);
var capabilities = new DesiredCapabilities(options);
Driver = new RemoteWebDriver(new Uri("http://localhost:9515"), capabilities);
鉴于我们在下面将其用作模型:
public ActionResult Index()
{
var users = db.Users.Include(u => u.Roles);
return View(users.ToList());
}
如果我们在行动中消除@model IEnumerable<DataLayer.Users>
,它将正常工作。
Tolist()
使用脚手架有什么好处?
如果我们消除Tolist()
是错的吗?
答案 0 :(得分:3)
如果您在控制器的操作中使用Tolist()
,则查询users
是在您的操作中执行的。您正在向视图传递类型为List<DataLayer.Users>
的模型,因为它实现了IEnumerable<DataLayer.Users>
,所以可以正常工作。
如果您在控制器的操作中删除了Tolist()
,则查询users
将不在您的操作中执行。您正在向视图传递类型为IQueryable<DataLayer.Users>
的模型,因为它实现了IEnumerable<DataLayer.Users>
,所以可以正常工作。当然,在Razor视图中的某处,您正在做一个循环,就像在视图模型上使用foreach
一样,因此查询是通过视图执行的,而不是在控制器的操作中执行。同样也没有引发异常,因为DbContext
仍在控制器上的字段中声明为不在操作方法中的本地字段,因此它仍处于打开状态。
更好的做法是在操作内部执行查询(使用ToList()
),以便剃刀视图除了读取结果外不执行任何操作。这样一来,您将在操作内收到与查询执行相关的任何错误,可以捕获它们并根据需要进行记录。