使用相同类型的对象时生成的转换异常

时间:2013-10-31 21:12:33

标签: c# asp.net .net dictionary

我以前使用静态变量来保存我想要在回发之间保存的变量数据。我遇到了问题,发现当appdomain结束时,这些变量中的数据会丢失。所以我做了一些研究并决定选择ViewStates:

static Dictionary<string, linkButtonObject> linkButtonDictonary;


protected void Page_Load(object sender, EventArgs e)
{
    if (ViewState["linkButtonDictonary"] != null)
    {
        linkButtonDictonary = (Dictionary<string, linkButtonObject>)ViewState["linkButtonDictonary"];
    }
    else
    {
        linkButtonDictonary = new Dictionary<string, linkButtonObject>();
    }
}

这是我使用的非常简单的类:

[Serializable]
public class linkButtonObject
{
    public string storyNumber { get; set; }
    public string TaskName { get; set; }
}

我正在添加到linkBut​​tonDictionary,因为gridview是数据绑定:

protected void hoursReportGridView_OnRowDataBound(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        LinkButton btn = (LinkButton)e.Row.FindControl("taskLinkButton");
        linkButtonObject currentRow = new linkButtonObject();
        currentRow.storyNumber = e.Row.Cells[3].Text;
        currentRow.TaskName = e.Row.Cells[5].Text;
        linkButtonDictonary.Add(btn.UniqueID, currentRow);
    }
}

看来我以前的问题已经解决,但是出现了新的问题。有时当我回发时,我收到此错误:

  

[A] {System.Collections.Generic.Dictionary {1}} 2 [System.String,linkBut​​tonObject]。类型A源自&#39; mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089&#39;在上下文中'LoadNeither&#39;在位置&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_32 \ mscorlib \ v4.0_4.0.0.0__b77a5c561934e089 \ mscorlib.dll&#39;。类型B源自&#39; mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089&#39;在上下文中'LoadNeither&#39;在位置&#39; C:\ Windows \ Microsoft.Net \ assembly \ GAC_32 \ mscorlib \ v4.0_4.0.0.0__b77a5c561934e089 \ mscorlib.dll&#39;。

当我到处使用同一个课程时,我不明白怎么会有一个演员问题。我做错了什么,如何解决?

2 个答案:

答案 0 :(得分:3)

感谢大家的投入,它帮助我追踪问题。

我在.aspx.cs页面中有我的简单类:

[Serializable]
public class linkButtonObject
{
    public string storyNumber { get; set; }
    public string TaskName { get; set; }
}

这就是程序集加载两次导致问题的原因。

答案 1 :(得分:2)

这看起来与以下问题完全相同:

InvalidCastException when serializing and deserializing

至于解决方案,处理装配负载等可能超出您的控制范围。

一种简单的方法是XML Serialize / JSON将您的数据序列化为字符串并将该字符串保存在ViewState中。要获得它,您只需要反转该过程。这肯定会解决重复加载问题。