最近在工作中遇到了非常奇怪的问题,在真正找到原因之前觉得不可解释,非常奇怪。在这里分享给大家,希望碰到类似的情况时,这篇文章给你一个提醒。
产生错误的背景
本人在View中写了一段大约10-20行的代码来动态生成WebGrid的column, 根据客户的意见,要将这段代码移到一个独立的c#代码中去。于是加了一个Class library, 把这段代码全部移过去了。把调用的代码写好,一运行,发现报错。这个错从来没有见过,仔细看了一下代码,认为没有问题,但是不明白为什么出问题。就稍微改了一下代码,运行又出另外一个奇怪的错误。看了代码还是觉得没有问题,还是不明白为什么出问题。下面是详细情况。
错误1:Entry point was not found.
这是主要代码, 这段c#代码已经全部移到这个c#类。运行以后,View抛出一个Exception: Entry point was not found, 而且指向的是@grid.GetHtml这一行。
using System; using System.Collections.Generic; using System.Web.Mvc; using System.Web.Helpers; namespace ClassLibrary1 { public static class myGrid { public static ListGenerateGridColumn(WebViewPage page) { var list = new List (); var gridColumn = new WebGridColumn(); gridColumn.ColumnName = "test"; gridColumn.Header = " test header"; list.Add(gridColumn); var gridColumn1 = new WebGridColumn(); gridColumn.Format = item => page.Html.Raw(""); list.Add(gridColumn1); return list; } } }
@model List@using ClassLibrary1; @{ ViewBag.Title = "Index"; } Index
@{ WebGrid grid = new WebGrid(source:Model); var list = myGrid.GenerateGridColumn(this); } @grid.GetHtml(columns: list)
看了好多遍代码,也进行了调试,看不出问题来。在调试过程中注意到一个怪现象,myGrid.GenerateGridColumn返回的应该是一个List
using System; using System.Collections.Generic; using System.Web.Helpers; namespace ClassLibrary1 { public static class myGrid { public static ListGenerateGridColumn() { var list = new List (); var gridColumn = new WebGridColumn(); gridColumn.ColumnName = "test"; gridColumn.Header = " test header"; list.Add(gridColumn); return list; } } }
@model List@using ClassLibrary1; @{ ViewBag.Title = "Index"; } Index
@{ WebGrid grid = new WebGrid(source:Model); var list = myGrid.GenerateGridColumn(); var gridColumn1 = new WebGridColumn(); gridColumn1.Format = item => Html.Raw(""); list.Add(gridColumn1); } @grid.GetHtml(columns: list)
这样的话,List的一部分Item就在myGrid中加入的,另一部分就在View中加入的。但是这样的还是会出问题: 错误信息如下:
错误2: Attempted to access an element as a type incompatible with the array
看了这个错误信息后也是查看代码,调试了半天,始终是认为代码没有问题,但是就是不明白为什么会出这个问题。而且调试的时候,这个List
于是网上搜索,网上有人提到可能是Web.config文件中引用错的版本的System.Web.Helpers.dll, 本人到Web.config中一看, Web.config没有问题。然后还继续找问题。找了两天,还是没有找到问题的根源。后来检查了每一个工程的References, 突然有一个令人眼前一亮的发现:这个ClassLibrary的竟然引用的是1.0版本的System.Web.Helpers.dll。这可能就是问题所在。于是把1.0换成2.0的Reference, 然后所有这些错误就都消失了。心中欣喜了一番。
经验谈
asp.net mvc有很多名称一样但是版本不一样的dll, 我们从老版本升级到新版本,或者构造一个新版本的asp.net mvc应用程序,在Web.config中,还有每一个工程的reference中都得确保我们引用了正确版本的dll。不然到时我们掉到哪个陷阱里都不知道。
出错的代码下载: http://dl.vmall.com/c0wdxad9am 为了给那些看了文字还是不太明白的同学准备的。
如果觉得此文值得推荐,请帮忙点推荐。