asp.net mvc4奇怪錯誤兩例及解決方法


最近在工作中遇到了非常奇怪的問題,在真正找到原因之前覺得不可解釋,非常奇怪。在這里分享給大家,希望碰到類似的情況時,這篇文章給你一個提醒。

產生錯誤的背景

本人在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 List<WebGridColumn> GenerateGridColumn(WebViewPage page)
        {
            var list = new List<WebGridColumn>();
            var gridColumn = new WebGridColumn();
            gridColumn.ColumnName = "test";
            gridColumn.Header = " test header";
            list.Add(gridColumn);
            var gridColumn1 = new WebGridColumn();
            gridColumn.Format = item => page.Html.Raw("<a href=\"test\"></a>");
            list.Add(gridColumn1);
            return list;
        }
    }
}
myGrid.cs
@model List<Class1>
@using ClassLibrary1;
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
@{
    WebGrid grid = new WebGrid(source:Model);
    var list = myGrid.GenerateGridColumn(this);
}
@grid.GetHtml(columns: list)
View的代碼

看了好多遍代碼,也進行了調試,看不出問題來。在調試過程中注意到一個怪現象,myGrid.GenerateGridColumn返回的應該是一個List<WebGridColumn>,試圖在Watch窗口查看其值時卻出了一個莫明其妙的錯誤: Unable to evaluate the expression. Operation not supported. Unknown error: 0x8004f0ed. 這樣就帶來了很大的問題。調試也看不出問題。究竟問題在哪里呢。雖然沒有明顯的證據,本人看到有一個Html在這段代碼中,懷疑這個Html.Raw引起的問題。本人覺得這個Html.Raw可能必須得在View中才能正常工作。於是就試着將包含Html.Raw的那段代碼移出c#類代碼,還是放到View中。代碼就成了這樣:

using System;
using System.Collections.Generic;
using System.Web.Helpers;

namespace ClassLibrary1
{
    public static class myGrid
    {
        public static List<WebGridColumn> GenerateGridColumn()
        {
            var list = new List<WebGridColumn>();
            var gridColumn = new WebGridColumn();
            gridColumn.ColumnName = "test";
            gridColumn.Header = " test header";
            list.Add(gridColumn);
            return list;
        }
    }
}
改過了的myGrid.cs
@model List<Class1>
@using ClassLibrary1;
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
@{
    WebGrid grid = new WebGrid(source:Model);
    var list = myGrid.GenerateGridColumn();
    var gridColumn1 = new WebGridColumn();
    gridColumn1.Format = item => Html.Raw("<a href=\"test\"></a>");
    list.Add(gridColumn1);
}
@grid.GetHtml(columns: list)
改過了的View代碼

這樣的話,List的一部分Item就在myGrid中加入的,另一部分就在View中加入的。但是這樣的還是會出問題: 錯誤信息如下:

錯誤2: Attempted to access an element as a type incompatible with the array

看了這個錯誤信息后也是查看代碼,調試了半天,始終是認為代碼沒有問題,但是就是不明白為什么會出這個問題。而且調試的時候,這個List<WebGridColumn>類型的list還是一樣不能在Watch窗口查看,錯誤信息還是一樣的:Unable to evaluate the expression. Operation not supported. Unknown error: 0x8004f0ed,對比了MyGrid.cs的代碼和View的代碼, 明明都是往List中加入WebGridColumn類型的元素,應該是同樣的元素,不可能報這個錯誤的。想不透。

於是網上搜索,網上有人提到可能是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   為了給那些看了文字還是不太明白的同學准備的。

如果覺得此文值得推薦,請幫忙點推薦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM