关于设计时错误的CompositeControl和XML反序列化

时间:2009-11-26 14:42:40

标签: asp.net ajax serialization controls composite-controls

我收到“错误呈现控件”错误,只有当我将控件放在设置模式的webform上时才会出现错误,如果我运行页面控件显示正确。
上述语句并不重要,发生此错误是因为返回的工具栏对象为nul l。

调试后,问题出在从CeateChildControls()调用的函数中:

public static ToolBars LoadToolbarsFromConfigFile()
{

      ToolBars toolbars;
      Assembly executingAssembly = Assembly.GetExecutingAssembly();
      string resource = "Editor.ConfigFiles.ToolBars.xml";
      using (Stream stream = executingAssembly.GetManifestResourceStream(resource))
      {
            XmlSerializer serializer = new XmlSerializer(typeof(ToolBars));
            toolbars = (serializer.Deserialize(stream)) as ToolBars;

      }
      return toolbars;                
}

工具栏返回null! (在设计模式下)
但是当我运行页面时,工具栏会返回适当的数据。

如果您需要有关我的代码的更多信息,请询问。

更新

一定是装配的东西, 如果我使用文件流代替指定的文件,它确实有效。

另一个更新:

我稍微修改了我的代码,并为测试目的添加了“数据集”:

using (DataSet ds = new DataSet())
{               
    ds.ReadXml(typeof(TheEditor).Assembly.GetManifestResourceStream("Editor.ConfigFiles.ToolBars.xml"));
    //show message box to see if it works
    System.Windows.Forms.MessageBox.Show(ds.Tables.Count.ToString());    
}     

我注意到的另一件事是,当我将控件添加到新的网站项目时会发生以上所有情况,但是如果我设置控件项目的调试属性以启动外部程序(我启动visual studio),那么我创建了一个新项目并添加控件一切正常。

1 个答案:

答案 0 :(得分:2)

当您在Visual Studio中运行它时,您没有应用程序上下文,因此您不能在其上“GetExecutingAssembly” - 或者更确切地说,执行程序集是devenv.exe,而不是拥有你正在寻找的资源。

您可以使用控件的DesignMode属性来检查并查看是否在Visual Studio中呈现控件,并相应地修改您的行为:

public static ToolBars LoadToolbarsFromConfigFile()
{
  ToolBars toolbars;
  if (!DesignMode)
  {
    Assembly executingAssembly = Assembly.GetExecutingAssembly();
    string resource = "Editor.ConfigFiles.ToolBars.xml";
    using (Stream stream = executingAssembly.GetManifestResourceStream(resource))
    {
      XmlSerializer serializer = new XmlSerializer(typeof(ToolBars));
      toolbars = (serializer.Deserialize(stream)) as ToolBars;
    }
  }
  else
  {
    // Load a dummy toolbar here.
  }
  return toolbars;                
}

或者,您可以在调用代码中执行检查,但由于这是一个公共方法,因此不能保证所有调用者都会执行此检查,因此您最好在方法中执行此操作。

最后一个选项是create a Designer class,它会覆盖LoadToolbarsFromConfigFile方法并为您提供虚拟工具栏。