脚手架创造的Tolist()有什么好处?

时间:2018-06-22 11:28:55

标签: c# asp.net-mvc

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()是错的吗?

1 个答案:

答案 0 :(得分:3)

如果您在控制器的操作中使用Tolist(),则查询users 是在您的操作中执行的。您正在向视图传递类型为List<DataLayer.Users>的模型,因为它实现了IEnumerable<DataLayer.Users>,所以可以正常工作。

如果您在控制器的操作中删除了Tolist(),则查询users不在您的操作中执行。您正在向视图传递类型为IQueryable<DataLayer.Users>的模型,因为它实现了IEnumerable<DataLayer.Users>,所以可以正常工作。当然,在Razor视图中的某处,您正在做一个循环,就像在视图模型上使用foreach一样,因此查询是通过视图执行的,而不是在控制器的操作中执行。同样也没有引发异常,因为DbContext仍在控制器上的字段中声明为不在操作方法中的本地字段,因此它仍处于打开状态。

在评论哪个更好之后进行编辑?

更好的做法是在操作内部执行查询(使用ToList()),以便剃刀视图除了读取结果外不执行任何操作。这样一来,您将在操作内收到与查询执行相关的任何错误,可以捕获它们并根据需要进行记录。