ASP.NET MVC 5报错:Value cannot be null. Parameter name: source
解决WebGrid的ArgumentNullException:Model为null的问题
你碰到的这个System.ArgumentNullException完全符合你的推测——就是因为传给WebGrid的Model是null导致的。问题出在你的Index Action方法里,仔细看:你已经通过GetBooks获取到了数据data,但返回视图的时候没有把这个数据传递给视图,所以视图里的@model List<LibraryP3.BooksTable>自然就是null了。
第一步:修正Index Action方法
把你的Index方法最后一行的return View();改成return View(data);,这样数据就会作为Model传递到视图里,WebGrid就能拿到有效的source了。修正后的代码如下:
public ActionResult Index(int page = 1, string sort = "Author", string sortdir = "asc", string search = ""){ int pageSize = 10; int totalRecord = 0; if (page < 1) page = 1; int skip = (page * pageSize) - pageSize; var data = GetBooks(search, sort, sortdir, skip, pageSize, out totalRecord); ViewBag.TotalRows = totalRecord; ViewBag.search = search; // 这里把data作为Model传给视图 return View(data); }
第二步:额外的安全防护(可选)
为了避免后续可能出现的类似问题,你可以在视图里先判断Model是否为空,再初始化WebGrid,比如:
@model List<LibraryP3.BooksTable> @{ Layout = null; var grid = new WebGrid(canPage: true, rowsPerPage: 10); // 先判断Model是否为空,为空则传空列表 grid.Bind(source: Model ?? new List<LibraryP3.BooksTable>(), rowCount: ViewBag.TotalRows, autoSortAndPage:false); }
这样即使Model偶尔还是null的情况,也不会抛出异常,而是显示一个空的网格。
另外,你的GetBooks方法里,当查询不到数据时,v.ToList()会返回一个空列表而不是null,所以只要Action正确传递Model,视图里的Model就不会是null了——这一步主要是做双重保险。
内容的提问来源于stack exchange,提问作者André Mateus
相关产品推荐
相关产品推荐

