使用 LINQ to SQL 创建 DotNetNuke® 模块





5.00/5 (10投票s)
本教程将向您展示如何使用 LINQ to SQL 创建 DotNetNuke 模块。
要学习本教程,您需要
- Visual Studio Visual Web Developer Express 2008 (下载) 或 Visual Studio 2008
- DotNetNuke (下载)
- ASP.NET 3.5 (或更高版本) (下载)
本教程将向您展示如何使用 LINQ to SQL 创建 DotNetNuke 模块。这将大大加快模块的开发速度。
另请参阅
使用 LINQ to SQL 创建 DotNetNuke 模块 (第二部分)
设置
如果您还没有安装 Visual Studio Express 2008,请安装它。( 下载)
使用 Visual Studio 2008 打开 DotNetNuke
如果您使用的是 DotNetNuke 4.7 或更低版本,您将收到类似以下的提示信息
点击“是”。这将为 web.config 文件添加必要的更改,以允许 LINQ to SQL 运行。
在 Visual Studio 中,选择“生成”然后选择“生成解决方案”。在继续之前,您必须能够无错误地生成它。警告是可以的。
准备好创建模块了吗?
您必须有一个正常运行的 DotNetNuke 4 网站才能继续。如果您没有,可以使用 此链接 和 此链接 来查找帮助。
随着 DotNetNuke 的不断发展,它也在不断变化,因此获取最新帮助和信息的最佳方式是使用 DotNetNuke 论坛。
创建表
使用 Host 账户登录网站。
点击 HOST 菜单并选择 SQL
将以下脚本粘贴到框中
CREATE TABLE ThingsForSale ( [ID] [int] IDENTITY(1,1) NOT NULL, [ModuleId] [int] NOT NULL, [UserID] [int] NULL, [Category] [nvarchar](25), [Description] [nvarchar](500), [Price] [float] NULL ) ON [PRIMARY] ALTER TABLE ThingsForSale ADD CONSTRAINT [PK_ThingsForSale] PRIMARY KEY CLUSTERED ([ID]) ON [PRIMARY]
勾选“作为脚本运行”框并点击“执行”。
设置模块
如果您还没有在 Visual Studio (或 Visual Web Developer Express) 中打开 DotNetNuke 网站,请选择 文件,然后选择 打开网站。
选择 DotNetNuke 网站的根目录,然后点击 打开 按钮。
右键单击 App_Code 文件夹并选择 新建文件夹。
将文件夹命名为 LinqThings4Sale。
在 解决方案资源管理器 中,双击 web.config 文件以将其打开。
在 web.config 文件中添加以下行
<add directoryName="LinqThings4Sale" />
到 <codeSubDirectories> 部分。这样做是为了指示 ASP.NET 此处将创建非 VB.NET 语言的代码(VB.NET 是 DotNetNuke 主项目使用的语言)。
右键单击 App_Code 文件夹并选择 刷新文件夹。
LinqThings4Sale 文件夹的图标现在将发生变化,表明该文件夹已被识别为一个特殊文件夹。
创建 LINQ to SQL 类
右键单击 App_Code 文件夹下的 LinqThings4Sale 目录,然后选择 添加新项。
在 添加新项 窗口中,选择 LINQ to SQL Classes 模板,输入 LinqThings4Sale.dbml 作为 名称,并选择 Visual C# 作为 语言。点击 添加 按钮。
稍等片刻,对象关系设计器 将在编辑窗口中打开。
从工具栏中,选择 视图,然后选择 服务器资源管理器。
在 服务器资源管理器 中,右键单击根节点 (数据连接) 并选择 添加连接。
输入连接 DotNetNuke 网站运行所使用的数据库的信息。
这不是模块运行时将使用的连接(您将在后续步骤中设置该连接)。这仅是为了允许您使用 对象关系设计器。点击 确定 按钮。
当连接显示在 服务器资源管理器 中时,点击加号图标展开其对象树以显示表。
找到 ThingsForSale 表。
点击它并将其拖放到左侧的 对象关系设计器 面板上。
点击 对象关系设计器 面板上的任意空白区域,以便 LinqThings4SaleDataContext 的属性显示在 属性 窗口中(您也可以从属性窗口中的下拉列表中选择它)。
在 连接 下拉列表中选择 SiteSqlServer (Web.config)。这将指示该类使用 DotNetNuke 网站的连接字符串。
连接属性应与右侧的图形相似。
关闭 LinqThings4Sale.dbl 文件。您应该会看到一个确认屏幕,询问您是否保存。点击 是 按钮。
数据访问层现已完成。
创建模块
在 解决方案资源管理器 中,右键单击 DesktopModules 文件夹并选择 新建文件夹。
将文件夹命名为 LinqThings4Sale。
右键单击 LinqThings4Sale 文件夹并选择 添加新项。
在 添加新项 框中,选择 Web 用户控件 模板,输入 View.ascx 作为 名称,选择 Visual C# 作为 语言,并勾选 将代码放在单独的文件中 复选框。
当 View.ascx 页面打开时,切换到源代码视图并找到 Inherits 行。
将其更改为
DotNetNuke.Modules.LinqThings4Sale.View
保存文件。
在 解决方案资源管理器 中 (在 LinqThings4Sale 目录下方),点击 View.ascx 文件旁边的加号图标,然后双击 View.ascx.cs 文件将其打开。
用以下代码替换所有代码
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using DotNetNuke; using DotNetNuke.Security; using LinqThings4Sale; namespace DotNetNuke.Modules.LinqThings4Sale { public partial class View : DotNetNuke.Entities.Modules.PortalModuleBase { protected void Page_Load(object sender, EventArgs e) { } } }
保存文件。从 工具栏 中,选择 生成,然后选择 生成页面。页面应能无错误地生成。
切换到 View.ascx 文件,并切换到 设计 视图。从 工具箱 的 数据 部分,选择 LinqDataSource 控件。
将 LinqDataSource 控件拖到 View.ascx 页面的设计图面上。点击选项 (控件右侧的右箭头),然后选择 配置数据源。
在 配置数据源 框中,在下拉列表中选择 LinqThings4Sale.LinqThings4SaleDataContext,然后点击 下一步 按钮。
将显示 配置数据选择 屏幕。保留默认选项。
点击 Where 按钮。
在 配置 Where 表达式 屏幕上
- 在 列 下拉列表中选择 ModuleId
- 在 运算符 下拉列表中选择 = =
- 在 源 下拉列表中选择 None
点击 添加 按钮。
这指示 LinqDataSource 控件按 ModuleId 过滤结果。每个新模块实例都有一个不同的 ModuleId。我们将在后续步骤中的代码隐藏中将此 ModuleId 传递给 LinqDataSource 控件。 点击 确定 按钮。
点击 完成 按钮。
在 LinqDataSource 控件的选项中,勾选 启用删除、启用插入 和 启用更新 复选框。
从工具箱中拖动一个 GiridView 控件并将其放置在 LinqDataSource 控件下方。在 GridView 控件的选项中,从 选择数据源 下拉列表中选择 LinqDataSource1。
GridView 将绑定到数据源并为表中的字段创建列。
在 GridView 控件的选项中,勾选 启用分页、启用排序、启用编辑 和 启用删除 复选框。
在 GridView 控件的选项中,点击 编辑列 链接。
在 选定字段 部分选择 ID 列,然后在 BoundField 属性部分,将 可见 更改为 False。对 ModuleId 和 UserID 字段执行相同操作。点击 确定 按钮。
GridView 现在将类似于右侧的图像。
将一个 FormView 控件拖到设计图面上,并将其放置在 GridView 下方几个位置 (您将在后续步骤中在它们之间放置一个 LinkButton 控件)。
在 FormView 控件的选项中,从 选择数据源 下拉列表中选择 LinqDataSource1。点击 编辑模板 链接。
在 FormView 控件的选项中,在 显示 下拉列表中选择 InsertItem Template。
drop-down.
切换到源代码视图,并将 InsertItemTemplate 部分替换为以下代码
<InsertItemTemplate> Category: <asp:DropDownList ID="DropDownList1" runat="server" DataSource='<%# Eval("Category") %>' SelectedValue='<%# Bind("Category") %>' EnableViewState="False"> <asp:ListItem>Home</asp:ListItem> <asp:ListItem>Office</asp:ListItem> <asp:ListItem>Electronics</asp:ListItem> <asp:ListItem>Misc.</asp:ListItem> </asp:DropDownList> Price: $ <asp:TextBox ID="PriceTextBox" runat="server" Text='<%# Bind("Price") %>' Width="56px" CausesValidation="True" EnableViewState="False"></asp:TextBox><br /> <asp:RangeValidator ID="RangeValidator1" runat="server" ControlToValidate="PriceTextBox" ErrorMessage="Price must be greater than 0" MaximumValue="99999" MinimumValue="1"></asp:RangeValidator> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="PriceTextBox" ErrorMessage="A price is required"></asp:RequiredFieldValidator><br /> Description:<br /> <asp:TextBox ID="DescriptionTextBox" runat="server" Text='<%# Bind("Description") %>' MaxLength="499" TextMode="MultiLine" Width="286px" EnableViewState="False"></asp:TextBox><br /> <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Insert" OnClick="InsertButton_Click"></asp:LinkButton> <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" OnClick="InsertCancelButton_Click"></asp:LinkButton> </InsertItemTemplate>
切换到设计视图,选择 编辑模板,然后选择 InsertItem Template,表单将类似于右侧的图像。
在 FormView 控件的选项中,点击 结束模板编辑。
在 FormView 的 属性 中,将 默认模式 设置为 插入。
同样,在 FormView 的 属性 中,将 可见 设置为 False。
在 工具箱 中,点击 LinkButton 控件。
将控件拖到设计图面上,并将其放置在 GridView 和 FormView 之间。
在 LinkButton 的属性中 (如果您难以选择属性,请切换到源代码视图并双击 "<asp:LinkButton"),将 文本 设置为 添加我的列表。
创建代码隐藏
View.ascx 文件现在应类似于右侧的图像。现在需要几个代码隐藏方法来完成模块。
LinqDataSource 控件的代码隐藏
我们希望修改 LinqDataSource 控件的行为,使其仅显示特定模块实例的记录。此外,在插入记录时,我们希望插入当前的 ModuleId 和当前的 UserID。右键单击 LinqDataSource 控件并选择 属性。属性将显示在 属性 窗口中 (如果未显示,请切换到源代码视图并点击 "<asp:LinqDataSource")。
点击黄色的“闪电”图标切换到控件的“事件”
在 Inserted 行键入 LinqDataSource1_Inserted 并点击其他地方 (或者您可以直接在框中双击,名称会自动插入)。
方法将被自动“连接”。
添加代码使方法如下所示
protected void LinqDataSource1_Inserted(object sender, LinqDataSourceStatusEventArgs e) { this.GridView1.DataBind(); }
(此方法指示 GridView 在记录插入后刷新自身) 在 Inserting 行键入 LinqDataSource1_Inserting 并点击其他地方。
添加代码使方法如下所示
protected void LinqDataSource1_Inserting(object sender, LinqDataSourceInsertEventArgs e) { ThingsForSale ThingsForSale = (ThingsForSale)e.NewObject; ThingsForSale.UserID = Entities.Users.UserController.GetCurrentUserInfo().UserID; ThingsForSale.ModuleId = ModuleId; }
(此方法将 "e",即即将插入的数据对象,强制转换为 ThingsForSale 对象。然后设置 UserID 和 ModuleId。) 在 Selecting 行键入 LinqDataSource1_Selecting 并点击其他地方。
添加代码使方法如下所示
protected void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e) { e.WhereParameters["ModuleId"] = ModuleId; }(此方法将当前的 ModuleId 传递给 LinqDataSource 控件。您可能还记得,已定义了一个 where 子句来期望传递一个 ModuleId。)
“添加我的列表”链接的代码隐藏
双击 添加我的列表 链接。
添加代码使方法如下所示
protected void LinkButton1_Click(object sender, EventArgs e) { this.FormView1.Visible = true; this.GridView1.DataBind(); }(此方法使输入表单可见。)
GridView 的代码隐藏
右键单击 GridView 控件并选择 属性。属性将显示在 属性 窗口中 (如果未显示,请切换到源代码视图并点击 "<asp:GridView")。切换到事件,在 RowDataBound 行输入 GridView1_RowDataBound 并点击其他地方。
添加代码使方法如下所示
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if ((e.Row.RowType == DataControlRowType.DataRow)) { ThingsForSale ThingsForSale = ((ThingsForSale)(e.Row.DataItem)); if ((PortalSecurity.IsInRole("Administrators")) || (Entities.Users.UserController.GetCurrentUserInfo().UserID == (int)ThingsForSale.UserID)) { e.Row.Cells[0].Enabled = true; } else { e.Row.Cells[0].Text = " "; } } }(此方法将 "e",即包含当前行数据的对象,强制转换为 ThingsForSale 对象。然后将 UserID 与当前用户的 UserID 进行比较。如果 UserID 与当前用户匹配,或者当前用户是管理员,则启用 GridView 上的第一列 (这允许用户编辑行)。)
向代码隐藏添加其他方法
将这两个方法添加到代码隐藏中protected void InsertButton_Click(object sender, EventArgs e) { this.FormView1.Visible = false; LinkButton1.Text = "Update Successful - Add Another Listing"; this.GridView1.DataBind(); } protected void InsertCancelButton_Click(object sender, EventArgs e) { this.FormView1.Visible = false; this.GridView1.DataBind(); }(这些方法的事件已在前面步骤粘贴代码时创建) 修改代码隐藏中的 Page_Load 方法,使其如下所示
protected void Page_Load(object sender, EventArgs e) { if ((PortalSecurity.IsInRole("Registered Users") || PortalSecurity.IsInRole("Administrators"))) { LinkButton1.Enabled = true; } else { LinkButton1.Text = "You must be logged in to add a Listing"; LinkButton1.Enabled = false; } }(此代码确定用户是否已登录,并显示“添加列表”链接 (如果已登录)。)
保存文件。从 工具栏 中,选择 生成,然后选择 生成页面。页面应能无错误地生成。
创建模块定义
在登录到 DotNetNuke 网站并以“host”身份登录后,在网页浏览器中,从菜单栏选择“Host”。然后选择“Module Definitions”。
点击向下的黑色箭头,使弹出菜单出现。在该菜单中选择“Create Module Definition”。
在 Edit Module Definitions 菜单中
- 为 MODULE NAME 输入“LinqThings4Sale”
- 为 FOLDER TITLE 输入“LinqThings4Sale”
- 为 FRIENDLY NAME 输入“LinqThings4Sale”
- 为 DESCRIPTION 输入“LinqThings4Sale”
- 为 VERSION 输入“01.00.00”
然后点击 UPDATE
为 NEW DEFINITION 输入“LinqThings4Sale”,然后点击“Add Definition”
接下来,点击“Add Control”
在 Edit Module Control 菜单中
- 为 TITLE 输入“LinqThings4Sale”
- 使用下拉列表选择“DesktopModules/LinqThings4Sale/View.ascx”作为 SOURCE
- 使用下拉列表选择“View”作为 TYPE
然后点击 UPDATE
在网站左上角的 PAGE FUNCTIONS 菜单下点击 ADD。
在 PAGE MANAGEMENT 菜单的 PAGE DETAILS 下
- 为 PAGE NAME 输入“LinqThings4Sale”
- 为 PAGE TITLE 输入“LinqThings4Sale”
- 为 DESCRIPTION 输入“LinqThings4Sale”
- 点击 ALL USERS 旁边的 VIEW PAGE 框。
然后点击 UPDATE
从 MODULE 下拉列表中选择“LinqThings4Sale”。
然后点击 ADD。
现在模块将显示出来。
教程完成。
注意: 要在另一个 DotNetNuke 网站上运行此模块,您需要在服务器上安装 ASP.NET 3.5 并修改 DotNetNuke 网站的 web.config 文件
更改: 将 <system.codedom> 部分更改为
<system.codedom> <compilers> <compiler language="vb;vbs;visualbasic;vbscript" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" extension=".vb" warningLevel="4"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="OptionInfer" value="true"/> <providerOption name="WarnAsError" value="false"/> </compiler> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="WarnAsError" value="false"/> </compiler> </compilers> </system.codedom>
<assemblies> <add assembly="Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> <add assembly="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> <add assembly="System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" /> <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </assemblies>