DNN建立独立模块开发项目 编译后丢失引用

这个问题已经困扰了我很久很久,一直没有解决。终于受不了,下定决心搞定它。

事情是这样,在我安装好DNN 的模版后,建立好项目, 见 利用vs独立开发DNN模块 。

首先注册Audit控件

<%@ Register TagPrefix="dnn" TagName="Audit" Src="~/controls/ModuleAuditControl.ascx" %>

调用



在注册了几个DNN的自带的UserControls后,错误出现在我的控件EditMyModule.ascx,编译就会报出下面的错误,。


Error 24 'System.Web.UI.UserControl' does not contain a definition for 'Text' and no extension method 'Text' accepting a first argument of type 'System.Web.UI.UserControl' could be found (are you missing a using directive or an assembly reference?) D:\Artur\dnn\installdnn\DotNetNuke_Community_05.01.00_Install\DesktopModules\MyModule\EditMyModule.ascx.cs 91 40 MyModule
Error 25 'System.Web.UI.UserControl' does not contain a definition for 'CreatedByUser' and no extension method 'CreatedByUser' accepting a first argument of type 'System.Web.UI.UserControl' could be found (are you missing a using directive or an assembly reference?) D:\Artur\dnn\installdnn\DotNetNuke_Community_05.01.00_Install\DesktopModules\MyModule\EditMyModule.ascx.cs 92 38 MyModule
Error 26 'System.Web.UI.UserControl' does not contain a definition for 'CreatedDate' and no extension method 'CreatedDate' accepting a first argument of type 'System.Web.UI.UserControl' could be found (are you missing a using directive or an assembly reference?) D:\Artur\dnn\installdnn\DotNetNuke_Community_05.01.00_Install\DesktopModules\MyModule\EditMyModule.ascx.cs 93 38 MyModule
Error 27 'System.Web.UI.UserControl' does not contain a definition for 'Text' and no extension method 'Text' accepting a first argument of type 'System.Web.UI.UserControl' could be found (are you missing a using directive or an assembly reference?) D:\Artur\dnn\installdnn\DotNetNuke_Community_05.01.00_Install\DesktopModules\MyModule\EditMyModule.ascx.cs 157 50 MyModule

问了下同事,这是由于在转换web应用程序(Convert to web application)时程序自动生成出错,直接在文件的相关的

EditMyModule.ascx.designer.cs文件中修改,先找到下面这段代码

protected global::System.Web.UI.UserControl ctlAudit;
修改成这样

protected global::DotNetNuke.UI.UserControls.ModuleAuditControl ctlAudit;
就可以了,其他的控件按照相应的修改

在DotNetNuke.UI.UserControls命名控件下有很多的控件,像ModuleAuditControl、TextEditor都在这里常用的控件 ,更多的相关介绍见园子里的DNN通用控件介绍上 DNN通用控件介绍下

但是后来发现这种方法有一种弊端,那就是改了一次下次还得改,只有你修改了EditMyModule.ascx控件中的代码 ,那么在EditMyModule.ascx.desiger.cs中中,那该死的错误又会出现了。

经过一段时间的摧残,实在是没办法了,要调试的次数多,改来改去,就浪费时间了。google之,在这里找到了。

好了,解决方法如下:

1.彻底删除EditMyModule.ascx.desiger.cs文件

2.在EditMyModule.ascx.cs源代码文件中手动声明相关的控件名字

protected DotNetNuke.UI.UserControls.TextEditor txtContent,MyTxtContent;
protected DotNetNuke.UI.UserControls.ModuleAuditControl ctlAudit,MyctlAudit;


3.右键EditMyModule.ascx 选择 Convert to web application

4.编译 succeeded

搞定收工!

DNN模块开发

学习DNN已经很长时间了,再不写点东西出来,就对不住自己了。话说DNN已经出来差不多6年了,该写的东西许多的前辈们基本都写完了,那我写什么呢?那就写模块的源代码剖析吧。模块开发,可以建立独立的项目来进行开发,这样主要是为了节约时间。详细见这里。一般情况下是用在VS2008中打开整个站点来开发模块,但是缺点是浪费时间,编译浪费时间。

建立好模块项目后,基本一个示例的东西都弄好了。就模块中的搜索功能以及导入、导出进行研究。

导出主要是由

代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> public string ExportModule(int ModuleID)
{

string strXML = "";

List colMyModules = GetMyModules(ModuleID);
if (colMyModules.Count != 0)
{
strXML += "";
foreach (MyModuleInfo objMyModule in colMyModules)
{
strXML += "";
strXML += "" + XmlUtils.XMLEncode(objMyModule.Content) + "";
strXML += "";
}
strXML += "";
}

return strXML;

}

C# 语言规范学习笔记(一)

1.object是所有类型的基类,所有类型都继承这一个唯一的跟类型。

2.利用命令行编译

输入命令 csc hello.cs 编译后将生成hell.exe的可执行程序集。

3.实例可以利用关键字 this来引用特定的封闭对象实例,静态方法不需要引用特定对象

4.利用命令行编译为库

输入命令 csc /t:library acme.cs 将产生acme.dll程序集。

5.程序集包含中间语言(Intermadiate Language,IL)指令形式的可执行代码和元数据(metadata)形式的符号信息。

6..net公共语言运行库的实时编译器(JIT)将程序集的IL代码 自动转换为特定于处理器的代码。

7.编译test.cs 使用来自acme.dll程序集

输入命令 csc /r:aacme.dll test.cs 将产生test.exe的可执行程序集。

8.C#的类型分为两种:引用类型(reference type)和值类型(value type)

值类型的变量直接包含它们的数据

引用类型的变量存储对它们的数据的引用,引用类型称为对象。
9.对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有它们自己的数据副本(除 ref 和 out 参数变量外),因此对一个变量的操作不可能影响另一个变量。

10.C# 的值类型进一步划分为简单类型 (simple type)、枚举类型 (enum type) 和结构类型 (struct type)C# 的引用类型进一步划分为类类型 (class type)、接口类型 (interface type)、数组类型 (array type) 和委托类型 (delegate type)

下表为 C# 类型系统的概述。

类别 说明
值类型 简单类型 有符号整型 sbyteshortintlong
无符号整型 byteushortuintulong
Unicode 字符 char
IEEE 浮点型 floatdouble
高精度小数 decimal
布尔型 bool
枚举类型 enum E {…} 形式的用户定义的类型
结构类型 struct S {…} 形式的用户定义的类型
引用类型 类类型 所有其他类型的最终基类 object
Unicode 字符串 string
class C {…} 形式的用户定义的类型
接口类型 interface I {…} 形式的用户定义的类型
数组类型 一维和多维数组例如 int[]  int[,]
委托类型 delegate T D(…) 形式的用户定义的类型

11.

 

 

强类型 弱类型 显式类型 隐式类型

所谓的显式类型和隐式类型,区别在于对于变量,是否需要显式说明它的类型。对于显式类型语言来说,一个变量的类型,是在变量声明之初就决定了的,声明之后不能更改。

//C++
int x;  //这里x被声明为一个整型。
x = 10; //OK,类型匹配。
x = "abc"; //Error! 类型不匹配
x = 10.24; //虽然在语法上OK,但是这种写法会引发隐式类型转换,
//x中实际存储的值是10,而不是10.24。

当然,即使在显式类型的语言中,也有所谓的“隐式类型转换”机制让用户在书写语法上自由一些。比如上面的例子中,将浮点数10.24赋值给一个整型 量并不会导致语法错误,而是会引发隐式类型转换。但即使是隐式类型转换,也是将“不符合类型的值”向变量所具有的类型靠拢,而不会改变变量的类型。

而隐式类型语言就不同了。隐式类型语言对变量没有显式的声明。一个变量没有固定的类型,它的类型是随着当前存储的内容而变化的。

#Python
x = 10   #这时x是一个int类型
x = "This is a string"  #x同样可以接受一个字符串,
#这时,x的类型由int转变为了string
x = 10.24 #x又由string变成了float类型,
#注意这里并没有什么隐式类型转换,
#x里的值就是确切的float类型数值10.24,
#改变的是x的类型,而不是存储其中的数值。

但是我们要意识到一件事:我在上面举的例子,显式类型也好,隐式类型也好,它们都是有类型这个概念的!

C++自不必说了,对变量声明时指定的类型就说明了它是有类型区分的。那么像Python这样的隐式类型语言,我们看不到变量的类型,如何证明它是有类型的呢?首先,python有type函数,可以看到变量当前的类型。

>>> x=10
>>> type(x)

>>> x="This is a string"

>>> type(x)

>>> x=10.24
>>> type(x)

这里我们可以清楚的看到当赋予x不同值的时候,x的类型是会变化的。

另外,在Python中,不同类型的对象不能相互替代和操作。

>>> 10 + '20'
Traceback (most recent call last):
  File "", line 1, in
TypeError: unsupported operand type(s) for +: 'int' and 'str'

这一切都充分的证明,在Python里,是有明确的类型的概念。

而某一些语言,它们是没有很明确的“类型”的概念的,这些语言就被成为弱类型语言。强类型和弱类型的主要区别是,在语言中是否存在明确的类型概念

Perl和PHP就是很著名的弱类型语言。

#Perl
$x = 10+'20';    #这里的10是整型而'20'是字符串?
#不,Perl不关心这个。
#只要它们“看起来像”数字,就可以放到一起运算,不是么?
print $x;           #输出了30

在弱类型的世界中,所有的东西都是一样的,你不用区分它们到底是什么类型。事实上,也许在内部实现中,所有的东西最终都被存储为同一种类型。

显式类型一定是强类型的,而弱类型一定是隐式类型的。但隐式类型也有可能是强类型的,比如Python。

怎样区分强类型还是弱类型?很简单,让它们做一做 10 + ‘20’ 吧 🙂

强类型和弱类型的主要区别在于:在语言中是否存在明确的类型概念
Python、C++是强类型的语言。
Perl、PHP是很著名的弱类型语言。

文章作者令狐虫