Dai's profilehqdai's spaceBlogGuestbookNetwork Tools Help

hqdai's space

Dai Hoang

Location
Interests
I'm not totally perfect but a part in me is really exellent
March 26

Lỗi ajax thường gặp trên IE (Sys.WebForms.PageRequestManagerServerErrorException ...)

Cái lỗi này gặp trc h nhiều rùi mà chưa bít sửa sao, cho tới h mới mò ra dc nguyên nhân của nó. ---> URL
Khi nhúng ajax vào bất kỳ 1 component nào cũng xuất hiện lỗi

Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the quest on the server. The status code returned from the server was: 404.

Nguyên nhân: Form action ko hỗ trợ việc mã hóa đường dẫn hơi bi "ngu" của IE, các ký tự unicode (tiếng việt), hoặc các ký tự đặc biệt đều bị mã hóa
Cách khắc phục: Theo mình thì làm sao làm, miễn đừng xài tiếng việt hay gì gì đặc biệt trên URL (cứ english cho nó lành)
Nếu là DNN module thì chỉ cần vào Host/Host Settings/ Friendly Url, xong bỏ check đi là xong.
Nếu là asp web page thì thêm dòng sau vào page_load:

form1.Action = HttpContext.Current.Request.RawUrl;





May 31

Từng bước Xây dựng Module trên DotNetNuke 4 và Windows Vista

 

Trong bài viết này, mình sẽ trình bày cách build 1 module của DNN sử dụng Web Application Projects của MS, cách build này để tạo ra 1 project riêng, ko cần phải open nguyên 1 website DotNetNuke trên Local để viết module nữa. Cách này còn làm cho việc chép và di chuyển các Project module trở nên dễ dàng hơn. Khi build project sẽ sinh ra file *.dll, chép file  này vào thư mục \Bin của DotNetNuke, hoặc cho build và chép trực tiếp bằng VS cũng OK.

Môi trường và các tools cần để viết Module trên Windows Vista

  • .Net Framework 2.0
  • SQL Server 2000 hoặc 2005
  • Internet Information Services 7 (IIS 7)
  • Visual Studio 2005 hoặc 2008 (VS 2005 or 2008)
  • Code Smith 3 hoặc 4 hỗ trợ template DotNetNuke(Nếu sử dụng Code smith 3 cần cái thêm .Net Framework 1.1)
  • Template để viết Module, ở đây mình xài C# nghen :), VB hơi bị gà ;) (Download)

Trước tiên cần cài đặt 1 số phần vào VS để tạo môi trường viết Module

  • MS Visual Studio 2005 Professional Edition - ENU (Download)
  • Visual Studio 2005 Web Application Projects (Download)

!(Cài đặt cái MS Visual Studio 2005 Professional Edition - ENU  trước nhé, sau đó mới cái Web Application Projects sau)

Trước tiên, bạn phải cài DotNetNuke trên máy local trước (Cách cài đặt tham khảo bài viết trước nà: http://hqdai.spaces.live.com/blog/cns!1C04769EC0B95D6A!137.entry)

 

  • Mở VS 2005
  • Vào File -> New -> Project
  • Bên phần Project Type, chọn Web, bên cửa sổ tay phải chọn tiếp C# DNN Module Template
  • Đặt tên cho Project
  • Chọn đường dẫn đến thư mục cài đặt DNN\DesktopModules
  • Bỏ dấu check  Create direction for solution
  • Click OK để tạo Project

 

image
  • Project Module DNN chia theo mô hình 3 lớp (Khoan bàn sâu về nó, nhiều lắm +___+, ở đây mình chỉ nói cấu trúc của nó sơ thôi)
  • Trong Components có 2 file SqlDataProvider.cs và DataProvider.cs, đây là 2 file chứa các hàm kết nối đến Database.
  • File NameModuleController.cs (DzenModuleController).cs. File này chứa các hàm để thực thi đối tượng được khai báo trong NameModuleInfo.cs (DzenModuleInfo.cs)
  • File NameModuleInfo.cs là file chứa class đối tượng, đối tượng này sẽ do chính người dùng định nghĩa và sử dụng để lập trình.
  • Ở bên ngoài có 3 file giao diện (*.ascx), đây là bề mặt và cốt lõi để người lập trình thiết kế và lập trình Module.
image

Tạo Cơ sở dữ liệu

  • Vào SQL Server, vào Database DotNetNuke, Chọn Table
  • Click chuột phải Table, chọn New Table...
  • Tạo Table và dữ liệu như hình bên
  • Đặt tên Table là DzenModule, Tên Table trùng với tên Project để trong quá trình gen code ko phải mất công sửa lại

!(DzenID là khóa chính và tăng tự động 1)

image

Dùng Code Smith để Gen code

  • Mở Code Smith (Ở đây mình xài Code smith 3, chỉ cần copy đoạn code từ trong class sau khi gen ra thôi, ko copy toàn bộ)
  • Dùng Code Smith để kết nối đến database
  • Trong phần SourceTable, click browse, trong phần datasource, click tiếp browse
  • Chọn Add, khai báo các thông số sau
    • Name: DNN483
    • Provider Type: SqlSchemaProvider
    • Connection String: Data Source=DAIHOANG-PC\SQLEXPRESS;Initial Catalog=Dotnetnuke; User ID=dnnuser; Password=123456 (Source=Computer Name, UserID và Password thì lấy user và pass của SQL khi cài đặt DNN)
    • Click OK
image
  • Gen code cho Controller Class
    • Mở file C# BLL Controller Class của Code Smith
    • Phần Source Table, chọn đến table DzenModule, click Select
    • Phần Object Qualifier để vào đó 1 khoảng trắng.
    • Sau đó click Generate
Đoạn code được sinh ra nằm trong phần Namespace
Copy toàn bộ, mở file DzenModuleController.cs
Thay thế toàn bộ code nằm trong namespace của file DzenModuleController.cs bằng đoạn code vừa được Gen ra nằm trong phần Namespace

public class DzenModuleController : DotNetNuke.Entities.Modules.ISearchable, DotNetNuke.Entities.Modules.IPortable
    {
        #region "Public Methods"       
        public DzenModuleInfo Get(int dzenID)
        {
            return (DzenModuleInfo)DotNetNuke.Common.Utilities.CBO.FillObject(DataProvider.
Instance().GetDzenModule(dzenID), typeof(DzenModuleInfo));
        }

        public ArrayList List()
        {
            return DotNetNuke.Common.Utilities.CBO.FillCollection(DataProvider.Instance().ListDzenModule(), typeof(DzenModuleInfo));
        }

        public int Add(DzenModuleInfo objDzenModule)
        {
            return (int)DataProvider.Instance().AddDzenModule(objDzenModule.DzenName, objDzenModule.DzenPlace, objDzenModule.DateCreate, objDzenModule.DateMod);
        }
        public void Update(DzenModuleInfo objDzenModule)
        {
            DataProvider.Instance().UpdateDzenModule(objDzenModule.DzenID, objDzenModule.DzenName, objDzenModule.DzenPlace, objDzenModule.DateCreate, objDzenModule.DateMod);
        }
        public void Delete(int dzenID)
        {
            DataProvider.Instance().DeleteDzenModule(dzenID);
        }
        #endregion

        #region "Optional Interfaces"       
        public DotNetNuke.Services.Search.SearchItemInfoCollection GetSearchItems(DotNetNuke.Entities.Modules.ModuleInfo ModInfo)
        {
            return null;
        }
        public string ExportModule(int ModuleID)
        {
            return "";
        }

        public void ImportModule(int ModuleID, string Content, string Version, int UserId)
        {
        }
        #endregion
    }

image

  • Gen code cho Info Class
    • Mở file C# BLL Info Class của Code Smith
    • Phần Source Table, chọn đến table DzenModule, click Select
    • Phần Object Qualifier để vào đó 1 khoảng trắng.
    • Sau đó click Generate
Đoạn code được sinh ra nằm trong phần Namespace
Copy toàn bộ, mở file DzenModuleInfo.cs
Thay thế toàn bộ code nằm trong namespace của file DzenModuleInfo.cs bằng đoạn code vừa được Gen ra nằm trong phần Namespace

public class DzenModuleInfo
    {
        #region "Private Members"
        int _dzenID;
        string _dzenName;
        string _dzenPlace;
        DateTime _dateCreate;
        DateTime _dateMod;
        #endregion
        #region "Constructors"
        public DzenModuleInfo()
        {
        }

        public DzenModuleInfo(int dzenID, string dzenName , string dzenPlace , DateTime dateCreate , DateTime dateMod)
        {
            this.DzenID = dzenID;
            this.DzenName = dzenName;
            this.DzenPlace = dzenPlace;
            this.DateCreate = dateCreate;
            this.DateMod = dateMod;
        }
        #endregion
        #region "Public Properties"
        public int DzenID
        {
            get{return _dzenID;}
            set{_dzenID = value;}
        }
        public string DzenName
        {
            get{return _dzenName;}
            set{_dzenName = value;}
        }

        public string DzenPlace
        {
            get{return _dzenPlace;}
            set{_dzenPlace = value;}
        }

        public DateTime DateCreate
        {
            get{return _dateCreate;}
            set{_dateCreate = value;}
        }

        public DateTime DateMod
        {
            get{return _dateMod;}
            set{_dateMod = value;}
        }
        #endregion
    }

image

  • Gen code cho DataProvider class
    • Mở file C# DataProvider của Code Smith
    • Phần Source Table, chọn đến table DzenModule, click Select
    • Phần Object Qualifier để vào đó 1 khoảng trắng.
    • Sau đó click Generate
Đoạn code sinh ra

#region "DzenModule Abstract Methods"
public abstract IDataReader GetDzenModule(int dzenID);
public abstract IDataReader ListDzenModule();
public abstract int AddDzenModule(string dzenName , string dzenPlace , DateTime dateCreate , DateTime dateMod);
public abstract void UpdateDzenModule(int dzenID, string dzenName , string dzenPlace , DateTime dateCreate , DateTime dateMod);
public abstract void DeleteDzenModule(int dzenID);
#endregion


Copy hết đoạn code, mở file DataProvider.cs, thay thế toàn bộ code nằm trong #region Abstract methods

image
  • Gen code cho SqlDataProvider class
    • Mở file C# SqlDataProvider của Code Smith
    • Phần Source Table, chọn đến table DzenModule, click Select
    • Phần Object Qualifier để vào đó 1 khoảng trắng.
    • Sau đó click Generate
Đoạn code sinh ra

#region "DzenModule Methods"
    public override IDataReader GetDzenModule(int dzenID)
    {
        return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, DatabaseOwner + ObjectQualifier + " DzenModuleGet", dzenID);
    }

    public override IDataReader ListDzenModule()
    {
        return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, DatabaseOwner + ObjectQualifier + " DzenModuleList");
    }

    public override int AddDzenModule(string dzenName, string dzenPlace, DateTime dateCreate, DateTime dateMod)
    {
        return int.Parse(SqlHelper.ExecuteScalar(ConnectionString, DatabaseOwner + ObjectQualifier + " DzenModuleAdd", GetNull(dzenName), GetNull(dzenPlace), GetNull(dateCreate), GetNull(dateMod)).ToString());
    }
    public override void UpdateDzenModule(int dzenID, string dzenName, string dzenPlace, DateTime dateCreate, DateTime dateMod)
    {
        SqlHelper.ExecuteNonQuery(ConnectionString, DatabaseOwner + ObjectQualifier + " DzenModuleUpdate", dzenID, GetNull(dzenName), GetNull(dzenPlace), GetNull(dateCreate), GetNull(dateMod));
    }

    public override void DeleteDzenModule(int dzenID)
    {
        SqlHelper.ExecuteNonQuery(ConnectionString, DatabaseOwner + ObjectQualifier + " DzenModuleDelete", dzenID);
    }
    #endregion

Copy hết đoạn code, mở file SqlDataProvider.cs, thay thế toàn bộ code nằm trong #region override methods

image

Trong quá trình Gen, Code Smith sẽ tạo ra các khoảng trắng nằm trong tên của Store Procedure
Tìm đến tên của các Store này và bỏ đi khoảng trắng

image

  • Gen Store Procedures
    • Mở file StoredProcedures của Code Smith
    • Phần Source Table, chọn đến table DzenModule, click Select
    • Phần Object Qualifier để vào đó 1 khoảng trắng.
    • Sau đó click Generate

Đoạn code sql sinh ra

/*

/****** Object:  Stored Procedure {databaseOwner}{objectQualifier} DzenModuleGet    Script Date: Saturday, May 31, 2008 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'{databaseOwner}{objectQualifier} DzenModuleGet') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure {databaseOwner}{objectQualifier} DzenModuleGet
GO

/****** Object:  Stored Procedure {databaseOwner}{objectQualifier} DzenModuleList    Script Date: Saturday, May 31, 2008 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'{databaseOwner}{objectQualifier} DzenModuleList') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure {databaseOwner}{objectQualifier} DzenModuleList
GO

/****** Object:  Stored Procedure {databaseOwner}{objectQualifier} DzenModuleAdd    Script Date: Saturday, May 31, 2008 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'{databaseOwner}{objectQualifier} DzenModuleAdd') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure {databaseOwner}{objectQualifier} DzenModuleAdd
GO

/****** Object:  Stored Procedure {databaseOwner}{objectQualifier} DzenModuleUpdate    Script Date: Saturday, May 31, 2008 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'{databaseOwner}{objectQualifier} DzenModuleUpdate') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure {databaseOwner}{objectQualifier} DzenModuleUpdate
GO

/****** Object:  Stored Procedure {databaseOwner}{objectQualifier} DzenModuleDelete    Script Date: Saturday, May 31, 2008 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'{databaseOwner}{objectQualifier} DzenModuleDelete') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure {databaseOwner}{objectQualifier} DzenModuleDelete
GO

/* -------------------------------------------------------------------------------------
/   DzenModuleGet
/  ------------------------------------------------------------------------------------- */
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE {databaseOwner}{objectQualifier} DzenModuleGet
    @DzenID int
AS

SELECT
    [DzenID],
    [DzenName],
    [DzenPlace],
    [DateCreate],
    [DateMod]
FROM {objectQualifier} DzenModule
WHERE
    [DzenID] = @DzenID
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

/* -------------------------------------------------------------------------------------
/   DzenModuleList
/  ------------------------------------------------------------------------------------- */
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE {databaseOwner}{objectQualifier} DzenModuleList
AS

SELECT
    [DzenID],
    [DzenName],
    [DzenPlace],
    [DateCreate],
    [DateMod]
FROM {objectQualifier} DzenModule
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

/* -------------------------------------------------------------------------------------
/   DzenModuleAdd
/  ------------------------------------------------------------------------------------- */
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE {databaseOwner}{objectQualifier} DzenModuleAdd
    @DzenName nvarchar(200),
    @DzenPlace nvarchar(100),
    @DateCreate datetime,
    @DateMod datetime
AS

INSERT INTO {objectQualifier} DzenModule (
    [DzenName],
    [DzenPlace],
    [DateCreate],
    [DateMod]
) VALUES (
    @DzenName,
    @DzenPlace,
    @DateCreate,
    @DateMod
)

select SCOPE_IDENTITY()
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

/* -------------------------------------------------------------------------------------
/   DzenModuleUpdate
/  ------------------------------------------------------------------------------------- */
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE {databaseOwner}{objectQualifier} DzenModuleUpdate
    @DzenID int,
    @DzenName nvarchar(200),
    @DzenPlace nvarchar(100),
    @DateCreate datetime,
    @DateMod datetime
AS

UPDATE {objectQualifier} DzenModule SET
    [DzenName] = @DzenName,
    [DzenPlace] = @DzenPlace,
    [DateCreate] = @DateCreate,
    [DateMod] = @DateMod
WHERE
    [DzenID] = @DzenID
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

/* -------------------------------------------------------------------------------------
/   DzenModuleDelete
/  ------------------------------------------------------------------------------------- */
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE {databaseOwner}{objectQualifier} DzenModuleDelete
    @DzenID int
AS

DELETE FROM {objectQualifier} DzenModule
WHERE
    [DzenID] = @DzenID
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Copy toàn bộ, bỏ vào Notepad
Vào Edit của Notepad, chọn Replace,
Phần Find what: {databaseOwner}{objectQualifier}
Phần Replace: để trắng
Click Replace All
Tiếp tục 1 lần nữa
Phần Find what: {objectQualifier}
Phần Replace: để trắng
Click Replace All

Sau đó copy tất cả code đã replace trong notepad

Mở SQL Server
Vào Database Dotnetnuke, chọn New Query
Paste toàn bộ code đã copy vào và click Execute

Build Module

Mở VS, click build
Trường hợp bị lỗi trong DzenModuleController.cs, lỗi báo ngay dòng ArrayList
Trường hợp này thêm vào using System.Collections; ở trên phần khai báo namespace

Sau đó lần lượt mở từng file
EditDzenModule.ascx.cs
Thay thế bằng đoạn code sau

using System;
using DotNetNuke.Common;
using DotNetNuke.Common.Utilities;
using DotNetNuke.Entities.Modules;
using DotNetNuke.Services.Exceptions;
using DotNetNuke.Services.Localization;

using Dzen.DzenModule.Components;

namespace Dzen.Modules.DzenModule
{
    public partial class EditDzenModule : PortalModuleBase
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }

        protected void cmdUpdate_Click(object sender, EventArgs e)
        {
            try
            {
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }

        protected void cmdCancel_Click(object sender, EventArgs e)
        {
            try
            {
                Response.Redirect(Globals.NavigateURL(), true);
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }

        protected void cmdDelete_Click(object sender, EventArgs e)
        {
            try
            {
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }
    }
}

Tiếp tục đến File ViewDzenModule.ascx.cs
Thay thế bằng đoạn code sau

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Web.UI;
using System.Web.UI.WebControls;
using DotNetNuke.Common.Utilities;
using DotNetNuke.Entities.Modules;
using DotNetNuke.Entities.Modules.Actions;
using DotNetNuke.Services.Exceptions;
using DotNetNuke.Services.Localization;

using Dzen.DzenModule.Components;

namespace Dzen.Modules.DzenModule
{
    public partial class ViewDzenModule : PortalModuleBase, IActionable
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {
                }
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }

        #region IActionable Members

        public DotNetNuke.Entities.Modules.Actions.ModuleActionCollection ModuleActions
        {
            get
            {
                //create a new action to add an item, this will be added to the controls
                //dropdown menu
                ModuleActionCollection actions = new ModuleActionCollection();
                actions.Add(GetNextActionID(), Localization.GetString(ModuleActionType.AddContent, this.LocalResourceFile),
                    ModuleActionType.AddContent, "", "", EditUrl(), false, DotNetNuke.Security.SecurityAccessLevel.Edit,
                     true, false);

                return actions;
            }
        }

        #endregion
    }
}

Sau đó mở file EditDzenModule.ascx, xóa hết code trong file này, chỉ chừa dòn đầu tiên
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="EditDzenModule.ascx.cs" Inherits="Dzen.Modules.DzenModule.EditDzenModule" %>

Tiếp tục mở file ViewDzenModule.ascx, xóa hết code trong file này, chỉ chừa dòn đầu tiên
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ViewDzenModule.ascx.cs" Inherits="Dzen.Modules.DzenModule.ViewDzenModule" %>

build Project, lúc này Porject sẽ báo Successful

Lập trình

Trong phần này, mình sẽ lập trình và đưa ra code cho các file, dựa vào database đã thiết kế như trên
Các bạn chỉ cần copy và paste code, Các bạn có thể lập trình và thiết kế theo ý của mình

Trong trường hợp gặp lỗi không thể kéo thả control trong asp.net
Bạn làm như sau
Click phải vào Project bên Solution Explorer, chọn Properties
Tìm đến Tab Web
Trong phần Server, bỏ Project URL: http://localhost/dnn_4_3_6
Tiếp tục check vào Override application root URL, bỏ http://localhost/dnn_4_3_6
Sau đó uncheck
Đóng Project, save và open lại


Code cho file ViewDzenModule.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ViewDzenModule.ascx.cs" Inherits="Dzen.Modules.DzenModule.ViewDzenModule" %>
<asp:datagrid id="dgDzenList" runat="server" AutoGenerateColumns="False"
                Width="100%" HorizontalAlign="Center" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" BackColor="White"
                CellPadding="3" GridLines="Horizontal" Font-Names="Tahoma" Font-Size="11px" OnItemCommand="dgDzenList_ItemCommand">
                <SelectedItemStyle Font-Bold="True" ForeColor="#F7F7F7" BackColor="#738A9C"></SelectedItemStyle>
                <AlternatingItemStyle BackColor="#F7F7F7"></AlternatingItemStyle>
                <ItemStyle ForeColor="#4A3C8C" BackColor="#E7E7FF"></ItemStyle>
                <HeaderStyle Font-Bold="True" ForeColor="#F7F7F7" BackColor="#4A3C8C"></HeaderStyle>
                <FooterStyle ForeColor="#4A3C8C" BackColor="#B5C7DE"></FooterStyle>
                <Columns>
                    <asp:TemplateColumn>
                        <ItemStyle HorizontalAlign="Center" Width="20px"></ItemStyle>
                        <ItemTemplate>
                            <asp:ImageButton Runat="server" ImageUrl="~/images/edit.gif" AlternateText="Edit" CommandName="Edit" ID="IBedit" Visible="<%# IsEditable %>">
                            </asp:ImageButton>
                        </ItemTemplate>
                    </asp:TemplateColumn>
                    <asp:BoundColumn DataField="DzenID" HeaderText="ID"></asp:BoundColumn>
                    <asp:BoundColumn DataField="DzenName" HeaderText="Name"></asp:BoundColumn>
                    <asp:BoundColumn DataField="DzenPlace" HeaderText="Place"></asp:BoundColumn>
                    <asp:BoundColumn DataField="DateCreate" HeaderText="DateAdd"></asp:BoundColumn>
                    <asp:BoundColumn DataField="DateMod" HeaderText="DateMod"></asp:BoundColumn>
                </Columns>
                <PagerStyle HorizontalAlign="Right" ForeColor="#4A3C8C" BackColor="#E7E7FF" Mode="NumericPages"></PagerStyle>
            </asp:datagrid>

Code cho file EditDzenModule.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="EditDzenModule.ascx.cs" Inherits="Dzen.Modules.DzenModule.EditDzenModule" %>
<table width=100%>
<tr>
    <td class=Subhead style="width: 60px">
        Name:</td>
    <td>
        <asp:TextBox ID="txtName" runat="server" CssClass="Normal"></asp:TextBox></td>
</tr>
<tr>
    <td class=Subhead style="width: 60px">
        Place:</td>
    <td>
        <asp:DropDownList ID="drlPlace" runat="server" CssClass="Normal">
            <asp:ListItem>Hồ Ch&#237; Minh</asp:ListItem>
            <asp:ListItem>H&#224; Nội</asp:ListItem>
            <asp:ListItem>Đ&#224; Lạt</asp:ListItem>
            <asp:ListItem>Nha Trang</asp:ListItem>
        </asp:DropDownList></td>
</tr>
<tr>
    <td style="height: 21px; width: 60px;"></td>
    <td style="height: 21px">
        <asp:Button ID="btUpdate" runat="server" CssClass="Normal" Text="Cập nhật" OnClick="btUpdate_Click" />sd
        <asp:Button ID="btDel" runat="server" CssClass="Normal" Text="Xóa" OnClick="btDel_Click" />
        <asp:Button ID="btCancel" runat="server" CssClass="Normal" OnClick="btCancel_Click"
            Text="Hủy bỏ" /></td>
</tr>
</table>

 

 
Code cho file ViewDzenModule.ascx.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Web.UI;
using System.Web.UI.WebControls;
using DotNetNuke.Common.Utilities;
using DotNetNuke.Entities.Modules;
using DotNetNuke.Entities.Modules.Actions;
using DotNetNuke.Services.Exceptions;
using DotNetNuke.Services.Localization;

using Dzen.DzenModule.Components;

namespace Dzen.Modules.DzenModule
{
    public partial class ViewDzenModule : PortalModuleBase, IActionable
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {
                    DzenModuleController objCtrl = new DzenModuleController();
                    dgDzenList.DataSource = objCtrl.List();
                    dgDzenList.DataBind();
                }
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }

        #region IActionable Members

        public DotNetNuke.Entities.Modules.Actions.ModuleActionCollection ModuleActions
        {
            get
            {
                //create a new action to add an item, this will be added to the controls
                //dropdown menu
                ModuleActionCollection actions = new ModuleActionCollection();
                actions.Add(GetNextActionID(), Localization.GetString(ModuleActionType.AddContent, this.LocalResourceFile),
                    ModuleActionType.AddContent, "", "", EditUrl(), false, DotNetNuke.Security.SecurityAccessLevel.Edit,
                     true, false);

                return actions;
            }
        }

        #endregion

        protected void dgDzenList_ItemCommand(object source, DataGridCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "Edit")
                {
                    string id = e.Item.Cells[1].Text.ToString();
                    Response.Redirect(EditUrl("DzenId", id, "Edit"));
                }
            }
            catch (Exception ex) { Response.Write(ex.ToString()); }
        }

    }
}

Code cho file EditDzenModule.ascx.cs

using System;
using DotNetNuke.Common;
using DotNetNuke.Common.Utilities;
using DotNetNuke.Entities.Modules;
using DotNetNuke.Services.Exceptions;
using DotNetNuke.Services.Localization;

using Dzen.DzenModule.Components;

namespace Dzen.Modules.DzenModule
{
    public partial class EditDzenModule : PortalModuleBase
    {
        int DzenId;

        protected void Page_Load(object sender, EventArgs e)
        {

            try
            {
                if (!(Request.Params["DzenId"] == null))
                {
                    DzenId = Int32.Parse(Request.Params["DzenId"]);
                }
                else
                {
                    DzenId = Null.NullInteger;
                }
                if (!IsPostBack)
                {
                    DzenModuleController objCtrl = new DzenModuleController();
                    if (!Null.IsNull(DzenId))
                    {           
                        DzenModuleInfo objInfoExist = new DzenModuleInfo();
                        objInfoExist = objCtrl.Get(DzenId);
                        txtName.Text = objInfoExist.DzenName;
                        drlPlace.SelectedValue = objInfoExist.DzenPlace;
                    }
                }
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }

        protected void btUpdate_Click(object sender, EventArgs e)
        {
            try
            {
                DzenModuleController objCtrl = new DzenModuleController();
                DzenModuleInfo objInfo = new DzenModuleInfo();
                objInfo.DzenName = txtName.Text;
                objInfo.DzenPlace = drlPlace.SelectedValue.ToString();
                if (Null.IsNull(DzenId))
                {
                    objInfo.DateCreate = DateTime.Now;
                    objInfo.DateMod = DateTime.Now;
                    objCtrl.Add(objInfo);
                }
                else
                {
                    DzenModuleInfo objInfoExist = new DzenModuleInfo();
                    objInfoExist = objCtrl.Get(DzenId);

                    objInfo.DzenID = objInfoExist.DzenID;
                    objInfo.DateMod = DateTime.Now;
                    objInfo.DateCreate = objInfoExist.DateCreate;
                    objCtrl.Update(objInfo);

                }
                Response.Redirect(Globals.NavigateURL(), true);
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }

        protected void btCancel_Click(object sender, EventArgs e)
        {
            try
            {
                Response.Redirect(Globals.NavigateURL(), true);
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }

        protected void btDel_Click(object sender, EventArgs e)
        {
             try
            {
                DzenModuleController objCtrl = new DzenModuleController();
                 objCtrl.Delete(DzenId);
                 Response.Redirect(Globals.NavigateURL(), true);
            }
            catch (Exception ex)
            {
                Exceptions.ProcessModuleLoadException(this, ex);
            }
        }
    }
}

   
Khai báo module trên DNN

Vào Host -> Module Definition
Create Module Definition


image
Click Create

image
Click Add Definition
Click Add Control

Khai báo cho Control

Khai báo cho Control View
Source: DesktopModules/DzenModule/ViewDzenModule.ascx

image

Click Update

Click Add Control
Khai báo cho Control Edit
Key: edit
Title: Dzen Edit
Source: DesktopModules/DzenModule/EditDzenModule.ascx
Type: Edit

image

Click Update

Click Add Control
Khai báo cho Control Settings
Key: settings
Title: Dzen Settings
Source: DesktopModules/DzenModule/Settings.ascx
Type: Edit

image 

 

Đưa module vào Web page

Trên thanh Control Panel của Web page, phần Module, chọn DzenModule
Click Add để thêm Module vào Web page

image 

Vậy là xong phần tạo Module và chạy thử
Hôm nay thứ 7, bài viết này mình làm trong 1 buổi sáng, h là trưa roài, đói quá ăn cơm thoai
Chúc cả nhà cuối tuần zui zẻ :)

  image
image
May 14

Sharepoint - Anh là ai?

Doanh nghiệp và tổ chức hiện nay vẫn luôn phải giải quyết những bài toán quản lý hết sức phức tạp... Làm thế nào để quản lý tập trung tất cả thông tin, cập nhật tất cả thông tin một cách kịp thời, làm thế nào để bảo mật thông tin, chia sẽ thông tin một cách hiệu quả nhất đến những đối tượng thực sự cần thiết. Đã có rất nhiều sản phẩm phần mềm ra đời và đã từng bước đáp ứng được nhu cầu của doanh nghiệp và tổ chức trong công tác quản lý, thế nhưng, dường như những chương trình này chỉ đáp ứng được một phần nhỏ trong công tác quản lý, khó khăn vẫn là phương thức quản lý tập trung, công việc quản lý của đa số doanh nghiệp hay tổ chức hiện nay phải tốn rất nhiều công sức của con người, mỗi phân ngành, mỗi phòng ban, hầu như đều sử dụng 1 chương trình riêng của quản lý, thống kê... và đưa ra những con số, và nhiệm vụ của người quản lý là phải tập hợp, gom góp, có khi phải sử dụng một chương trình khác để đưa vào các số liệu tập hợp và gom góp từ các kết quả của chương trình khác để quản lý riêng trong máy tính... Tất cả những điều đó, đôi khi tạo nên sự bất cập và lộn xộn trong công tác quản lý... Đôi khi làm tốn rất nhiều thời gian và nhân lực để có thể vận hành công việc và tránh cho việc xảy ra những vấn đề bất cập và lộn xộn...

Microsoft Office Sharepoint Portal (MOSS) ra đời, đã tạo nên sự thay đổi lớn trong phong cách làm việc, làm thay đổi cách thức làm việc và hơn hết là làm thay đổi văn hóa trong doanh nghiệp hoặc tổ chức. MOSS cung cấp 6 chức năng chính, chính 6 chức năng này đã làm nên điều kỳ diệu, có thể gỡ bỏ tất cả những vướng mắc của doanh nghiệp hoặc tổ chức đang gặp phải hiện nay.

  1. Collaboration: Cung cấp cho người dùng các tiện ích như Lịch làm việc, Tích hợp email, Quản lý dự án, Thảo luận trực tuyến, những chức năng này sẽ được phối hợp và triển khai một cách triệt trể trong suốt quá trình vận hành một công việc...
  2. Content Management: Cung cấp khả năng biên tập nội dung, soạn thảo nội dung, xuất bản web, cài đặt phân quyền trên nội dung web, khả năng tích hợp nhiều ngôn ngữ...
  3. Portal: Hỗ trợ chức năng Portal, cho phép người dùng cá nhân hóa những nội dung, tập hợp và chia sẽ chúng một cách dễ dàng hơn dựa vào khả năng phân quyền đã thiết lập. Khả năng cung cấp và xuất bản thông tin, nội dung tín tức ra ngoài internet.
  4. Search: Khả năng tìm kiếm rất mạnh của SharePoint, không chỉ cho phép tìm những nội dung bên trong SharePoint mà còn cho phép mở rộng tìm kiếm vào những hệ thống khác có tích hợp vào SharePoint, hơn nữa là khả năng Search Inside cho phép người dùng tìm kiếm một cách chính xác và dễ dàng hơn.
  5. BPM: Cung cấp khả năng tích hợp vào những hệ thống lớn khác, cho phép khai thác tối đa nội dung trong cá chệ thống khác, ngoài ra là công nghệ Single Sign-on, cho phép đăng nhập 1 lần để khai thác dữ liệu trong mọi tình huống mà không cần phải đăng nhập vào hệ thống nhiều lần.
  6. BI: Khả năng xử lý thông tin thông minh dựa vào những thiết lập ban đầu, giúp người dùng giảm bớt được quá trình phân tích, khả năng này sẽ cung cấp những số liệu, biểu đồ, tình trạng và cảnh báo giúp người dùng đưa ra những quyết định kịp thời và chính xác hơn.

Từ phiên bản framwork 3.0 trở đi, Microsoft đã cung cấp giải pháp Windows Workflow Foundation (WWF), đã làm thay đổi mạnh mẽ phong cách và văn hóa lập trình trước đây, và với MOSS, đã khai thác tối đa hiệu năng của WWF giúp người dùng tạo nên những luồng sự kiện, phương thức xử lý công việc một cách nhanh chóng dựa trên WWF và MOSS giúp tiến trình công việc sẽ trở nên nhanh chóng và chính xác hơn.

MOSS cho phép người dùng tạo ra những môi trường làm việc hiệu quả cho một hay nhiều dự án khác nhau,  bên cạnh đó, mỗi người dùng còn có thể khai thác các tính năng Blog, Wiki, Discussion, để chia sẽ thông tin, theo dõi thông tin... MOSS cho phép người dùng triển khai và khai thác tối đa các mô hình làm việc nhóm khác nhau, phương thức quản lý các mô hình này được MOSS cung cấp các tính năng cho phép đơn giản hóa quy trình quản lý, người dùng chỉ cần xem xét thông qua các biểu đồ, report của SHrePoint

Do là đứa con của Microsoft nên MOSS tích hợp rất mạnh với các ứng dụng văn phòng của MS Office và các ứng dụng khác của Windows. Khả năng tích hợp của những ứng dụng trên Windows với MOSS có thể nói là hoàn toàn tuyệt đối.

MOSS, nơi tập trung của tất cả mọi ứng dụng để tạo nên một môi trường làm việc thật chuyên nghiệp và thống nhất, làm nhẹ lại các quy trình quản lý, tự động hóa luồng công việc, dự đoán và xử lý thông tin thông minh.

MOSS được biết đến như người anh cả của tất cả mọi ứng dụng đáp ứng nhu cầu quản lý và điều hành tác vụ trong doanh nghiệp. Người anh này mang lại thay đổi về phong cách làm việc, văn hóa doanh nghiệp và quan trọng là người anh này gánh vác tất cả công cụ để quản lý và điều hành doanh nghiệp một cách dễ dàng nhất.

May 09

Triển khai cài đặt Dotnetnuke 4 trên Windows Vista

 

Trước tiên, bạn cần chuẩn bị:

  • SQL Server 2005.
  • DNN 4 Source (Download tại đây).
  • Windows Vista Home Premium trở lên.
    Đầu tiên, cần xem lại trong máy đã cài đặt IIS7 chưa, nếu rồi bạn có thể bỏ qua bước này.


Cách cài đặt IIS7

  • Vào Control Panel -> Programs and Features
  • Click Turn Windows features on or off
  • Check vào những thông số cài đặt như hình bên
  • Click OK chờ cho windows cài đặt xong cấu hình IIS7, sau đó khởi động lại máy.
imgE

Cài đặt database DNN trong SQL 2005

 

  • Mở SQL Server Management Studio Express
  • Tạo mới database, đặt tên cho database là dotnetnuke
  • Click OK để tiến hành tạo Database

Mẹo: Bạn nên thay đổi đường dẫn chứa database và logfile thay cho thư mục lưu mặc định của SQL, để tiện cho việc quản lý sau này.

Untitled-1
  • Tạo User quản lý và truy xuất database
  • Mở folder security bên tay trái, chọn New -> Login
  • Đặt tên cho user là dnnuser
  • Bên dưới cọn SQL Server Authentication, nhập password  cho user trên, password ở đây là 123456
  • Bỏ 3 dấu check Enforce password Policy, Enforce password Expiration, User must change password at next login
  • Default database chọn dotnetnuke

 

Untitled-2
  • Chuyển qua tab User Mapping
  • Click chọn database dotnetnuke, chọn tiếp db_owner
  • Click OK để hoàn thành việc tạo user.
Untitled-3

Tạo thư mục Website Dotnetnuke

  • Tạo 1 thư mục mới, đặt tên là DotNetNukeDev
  • Giải nén file source install Dotnetnuke và chép toàn bộ source vào thư mục này
  • Phân quyền truy cập thư mục cho user hệ thống NETWORK SERVICE, cho user này Full control
img27

Sửa đổi Web.config

  • Vào thư mục chứa web, tìm đến file web.config và mở file này ra.
  • Tìm đến dòng code <connectionStrings>

 

<connectionStrings>
        <!-- Connection String for SQL Server 2005 Express -->
        <add
          name="SiteSqlServer"
          connectionString="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|Database.mdf;"
          providerName="System.Data.SqlClient" />
        <!-- Connection String for SQL Server 2000/2005
    <add
      name="SiteSqlServer"
      connectionString="Server=(local);Database=DotNetNuke;uid=;pwd=;"
      providerName="System.Data.SqlClient" />
   -->
    </connectionStrings>

  • Thay thế bằng đoạn code sau

<connectionStrings>
        <!-- Connection String for SQL Server 2005 Express
        <add
          name="SiteSqlServer"
          connectionString="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|Database.mdf;"
          providerName="System.Data.SqlClient" /> -->
        <!-- Connection String for SQL Server 2000/2005 -->
    <add
      name="SiteSqlServer"
      connectionString="Server=(local);Database=dotnetnuke;uid=dnnuser;pwd=123456;"
      providerName="System.Data.SqlClient" />
    </connectionStrings>

  • Tiếp tục tìm đến đoạn code <appSettings>

<appSettings>
        <!-- Connection String for SQL Server 2005 Express - kept for backwards compatability - legacy modules   -->
        <add key="SiteSqlServer" value="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|Database.mdf;"/>
        <!-- Connection String for SQL Server 2000/2005 - kept for backwards compatability - legacy modules
    <add key="SiteSqlServer" value="Server=(local);Database=DotNetNuke;uid=;pwd=;"/>
    -->

  • Thay thế bằng đoạn code sau

<appSettings>
        <!-- Connection String for SQL Server 2005 Express - kept for backwards compatability - legacy modules  
        <add key="SiteSqlServer" value="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|Database.mdf;"/> -->
        <!-- Connection String for SQL Server 2000/2005 - kept for backwards compatability - legacy modules -->
    <add key="SiteSqlServer" value="Server=(local);Database=dotnetnuke;uid=dnnuser;pwd=123456;"/>

Thiết lập IIS

  • Vào Control Panel -> Administrative Tools -> Internet Information Services (IIS) Manager
  • Click chuột phải vào Default Web Site chọn Add Application.
  • Trong phần Physical Path: chọn đường dẫn đến thư mục đã chứa source DNN
  • Alias đánh vào tên DotNetNukeDev
  • Click Select và chọn Classic .NET AppPool.
  • Click OK
img34

Cài đặt DNN

img3D
   
   

 
Thanks for visiting!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.