Đỉnh NGUYỄN

life's a journey not a destination


Leave a comment

JUICE UI – Các điều khiển jQuery UI cho ASP.NET WebForms


Juice UI là dự án mã nguồn mở gồm tập các thành phần (các điều khiển) ASP.NET dựa trên jQuery UI giúp tăng tính tương tác và dễ lập trình cho giao diện ứng dụng web.

– Xem trang demo các điều khiển jQuery UI: http://jqueryui.com/demos/

– Xem trang demo các điều khiển Juice UI: http://juiceui.com/controls/

Bạn có thể dùng Juice UI dựa trên thỏa thuận giấy phép nguồn mở MIT License hoặc GNU General Public License (GPL) Version 2.

Tải về Juice UI bằng 2 cách:

– NuGet: http://nuget.org/packages/JuiceUI

– GitHub: https://github.com/appendto/juiceui

image

Advertisements


Leave a comment

Visual Studio 2010 và .NET Framework 4 Trainning Kit–Tháng 06 /2011


Microsoft vừa phát hành phiên bản cập nhật tháng 06 của VS 2010 và .NET Framework Trainning Kit. Trainning Kit chứa presentations, hands-on labs, và demos và được thiết kế để giúp bạn làm quen với các công nghệ:

  • C# 4
  • Visual Basic 10
  • F#
  • Parallel Extensions
  • Windows Communication Foundation
  • Windows Workflow
  • Windows Presentation Foundation
  • Silverlight 4
  • ASP.NET 4
  • Windows 7
  • Entity Framework
  • ADO.NET Data Services
  • Managed Extensibility Framework
  • Application Lifecycle Management
  • Windows Azure

Download VS 2010 và .NET Framework 4.0 Trainning Kit – Tháng 06/2011


Leave a comment

Một đoạn mã C# gây tò mò


static void Main(string[] args)
{
    System.Console.WriteLine("A  curiosity");
    http://www.msdn.microsoft.com/default.aspx
    System.Console.WriteLine("Compile Ok, Why?");
}

Lý giải như sau:

1. //www.msdn.microsoft.com/default.aspx chính là phần ghi chú

2. http: chỉ ra phần mã được đánh dấu (labeled statement) để có thể quay trở lại (với từ khóa goto).


Leave a comment

Mẫu thiết kế Singleton động


Với mẫu thiết kế Singleton động sau đây, mình có thể đối tượng là singleton hay non-singleton tại thời điểm chạy.

class MutableSingleton
{
    private static bool _singletonMode = true;
    private static MutableSingleton _instance = null;

    protected MutableSingleton()
    { 
    }

    public static MutableSingleton Instance
    {
        get
        {
            if (_instance == null || !IsSingleton)
                _instance = new MutableSingleton();

            return _instance;
        }
    }

    public static bool IsSingleton
    {
        get { return _singletonMode; }
        set { _singletonMode = value; }
    }
}

Có thể dùng phương thức GetHashCode() để kiểm tra 2 đối tượng cùng 1 thể hiện hay không

static void Main(string[] args)
{
    MutableSingleton singleton1 = MutableSingleton.Instance;
    MutableSingleton singleton2 = MutableSingleton.Instance;

    Console.WriteLine(singleton1.GetHashCode() + " equals " + singleton2.GetHashCode());

    MutableSingleton.IsSingleton = false;
    MutableSingleton nonSingleton1 = MutableSingleton.Instance;
    MutableSingleton nonSingleton2 = MutableSingleton.Instance;

    Console.WriteLine(nonSingleton1.GetHashCode() + " not equals " + nonSingleton2.GetHashCode());
}

Một kết quả

image


2 Comments

Thiết kế cơ sở dữ liệu đa ngôn ngữ


Bài viết này dựa trên kinh nghiệm cá nhân và không hẳn là cách tốt nhất

Xây dựng website đa ngôn ngữ có nhiều vấn đề, 1 trong số đó là cách lưu trữ nội dung trong csdl cho từng ngôn ngữ

1. Hướng tiếp cận dạng cột

Cách này phổ biến, cơ bản là tạo ra nhiều cột lưu trữ nội dung từng ngôn ngữ

table pages

— id (uniqueidentified)

— title_vi (nvarchar)

— title_en (nvarchar)

— content_vi (ntext)

— content_en (ntext)

Cách này truy vấn bằng cách tự động chọn các cột theo ngôn ngữ

SELECT id, title_vi AS title, content_vi AS content FROM pages

Hoặc có thể chọn tất cả các cột và lấy đúng cột theo ngôn ngữ

string title = (string)dataReader["title_" + Session["currentLanguage"]];

Thuận lợi

– Nó không trùng thông tin vì chĩ có 1 dòng cho mỗi mẫu tin và chỉ có các cột ngôn ngữ được nhân bản

– Dễ cài đặt

Bất lợi

– Khó duy trì. Dù dễ dàng với 2-3 ngôn ngữ nhưng không thích hợp khi có nhiều ngôn ngữ hoặc nhiều cột

– Khó thêm ngôn ngữ mới

2. Hướng tiếp cận nhiều dòng

Tương tự như cách ở trên, cách này tạo ra nhiều dòng thay vì nhân bản các cột theo ngôn ngữ

table pages

— id (uniqueidentified)

— language_id (smallint)

— title (nvarchar)

— content (nvarchar)

Cách này sẽ có 3 dòng cho cùng 1 trang nếu có 3 ngôn ngữ

Thuận lợi

– Dễ thêm ngôn ngữ mới

Bất lợi

– Nhiều nội dung trùng tại các cột chứa nội dung chung không cần chuyển ngữ

3. Hướng tiếp cận dạng bảng

Cách này phức tạp hơn 2 cách trên, nhưng thích hợp cho website động, có nhiều ngôn ngữ và có ý định thêm ngôn ngữ mới dễ dàng

table languages

— id (smallint)

— name (nvarchar)

table pages

— id (uniqueidentified)

— language_id (smallint)

— title (int fk)

— content (int fk)

table translation

— id (uniqueidentified)

table translation_entry

— translation_id (uniqueidentified)

— language_id (smallint)

— content (ntext)

Thuận lợi

– Dễ dàng thêm ngôn ngữ mới

Bất lợi

– Truy vấn nhiều bảng để lấy được nội dung

– Tất cả nội dung chuyển ngữ nằm cùng bảng

– Trông hơi khó làm việc và duy trì

4. Hướng tiếp cận dạng bảng 2

Đây là 1 biến thể của cách tiếp cận trên để dễ dàng làm việc và duy trì

Thay vì chỉ có 1 bảng dùng chuyển ngữ cho tất cả các bảng khác, bây giờ sẽ có 1 bảng dùng chuyển ngữ tưng ứng với 1 bảng. Di chuyển các cột cần chuyễn ngữ sang bảng dùng chuyển ngữ, còn lại các cột dùng chung (các cột không cần chuyển ngữ)

table languages

— id (smallint)

— name (nvarchar)

table pages

— id (uniqueidentified)

table pages_translation

— id (uniqueidentified)

— page_id (uniqueidentified)

— language_id (smallint)

— title (nvarchar)

— content (ntext)

SELECT * FROM pages JOIN pages_translation ON pages.id = pages_translation.page_id WHERE languages_id='1'

Thuận lợi

– Dễ thêm ngôn ngữ mới

– Dễ truy vấn

– Tên các cột được giữ nguyên

Bất lợi

– Tạo ra nhiều bảng chuyển ngữ tương ứng với các bảng

Kết luận

Chắc chắn có nhiều phương pháp khác nhau tạo nên website đa ngôn ngữ. Các giải pháp trên là ý kiến dựa vào kinh nghiệm cá nhân và cũng là phù hợp với các website đang làm

Dạng chuẫn khi thiết kế csdl vẫn chưa được bàn đến trong các phương pháp trên, sẽ có 1 bài viết như thế.

Cuối cùng, phương pháp tốt nhất là phương pháp phù hợp nhất với từng website, phù hợp nhất với cách làm việc và duy trì của bạn

Nếu bạn có hoặc tìm thấy cách nào khác, vui lòng chia sẽ với tôi và mọi người!

Tham khảo thêm

http://www.ibm.com/developerworks/web/library/wa-dbdsgn2.html

http://stackoverflow.com/questions/929410/what-is-best-practices-for-multilanguage-database-design


Leave a comment

Tính toán tuổi dùng C#


static void Main(string[] args)
{
    IFormatProvider culture = new CultureInfo("vi-VN", true);
    string myDob = "15/11/1987";
    DateTime dob = DateTime.Parse(myDob, culture, DateTimeStyles.NoCurrentDateDefault);

    int ageInYrs = DateTime.Now.Year - dob.Year;
    if (DateTime.Now.Month < dob.Month || (DateTime.Now.Month == dob.Month && DateTime.Now.Day < dob.Day))
        ageInYrs--;

    Console.WriteLine(ageInYrs);
}


1 Comment

Khác nhau giữa Eval và Bind – DataBind() trong .NET


Chức năng Eval dùng định nghĩa 1 cách liên kết dữ liệu (chỉ đoc). Chức năng Bind dùng cho cách thứ 2 (đọc và ghi).

Trong các điều khiển như GridView hay FormView, khi cần hiển thị dữ liệu chỉ đọc dùng điều khiển Label, dùng chức năng Eval. Ngược lại, khi cần cập nhật 1 trường xuống cơ sở dữ liệu, dùng 1 điều khiển TextBox chẳn hạn, dùng chức năng Bind()

Chú ý: Có thể dùng chức năng Bind để truy xuất giá trị các trường trong cơ sở dữ liệu, giống như Eval

<asp:FormView ID="FormView1" runat="server" AllowPaging="True" DataKeyNames="CustomerID"
    DataSourceID="SqlDataSource1">
    <EditItemTemplate>
        CustomerName:
        <asp:TextBox ID="txtCustName" runat="server" Text='<%# Bind("CName") %>'>
        </asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
        CustID:
        <asp:Label ID="lblCustID" runat="server" Text='<%# Eval("CID") %>'>
        </asp:Label>
    </ItemTemplate>
</asp:FormView>

Tìm hiểu thêm về các chức năng Eval và Bind.


Leave a comment

Điều hướng (redirect) từ HTTP sang HTTPS trong ASP.NET


Cách đơn giản nhất điều hướng người dùng từ http sang https. Nếu bạn thấy nó có vấn đề gì vui lòng cho mình biết nha 🙂

protected void Page_Load(object sender, EventArgs e)
{
    if (!Request.IsSecureConnection)
    {
        UriBuilder uri = new UriBuilder(Page.Request.Url);
        uri.Scheme = Uri.UriSchemeHttps;

        // Redirect to https
        Response.Redirect(uri.ToString());
    }
}


Thuộc tính IsSecureConnection của lớp HttpRequest chỉ ra rằng kết nối http dùng secure socket.


5 Comments

Cấu hình FCKEditor cho ASP.NET


1. Trang chủ CKEditor http://www.ckeditor.com

clip_image002[7]

2. Download FCKEditor & FCKEditor.NET

clip_image004[7]

3. FCKEditor là thành phần chính, giải nén và chép toàn bộ thư mục fckeditor vào thư mục gốc website

4. FCKEditor.NET là thành phần hỗ trợ ASP.NET, sau khi giải nén, chép tập tin FredCK.FCKeditorV2.dll từ \FCKeditor.Net_2.6.3\bin\Release\2.0 vào thư mục Bin của website.

clip_image006[7]

Tùy chọn xóa các thư mục và tập tin không cần thiết cho ASP.NET như:

– thư mục /fckeditor/_samples, /fckeditor/editor/_source/filemanager/[asp, cfm, lasso, perl, php, py],

– tùy chọn xóa các tập tin ngôn ngữ trong /fckeditor/editor/lang

– các tập tin _documentation.html, _upgrade.html, _whatsnew.html, _whatsnew_history.html, fckeditor.afp, fckeditor.asp, fckeditor.cfc, fckeditor.cfm, fckeditor.lasso, fckeditor.php, fckeditor.pl, fckeditor.py, fckeditor_php4.php, fckeditor_php5.php, fckutils.cfm & các file # mà bạn thấy 0 xài.

clip_image008[7]

5. Cấu hình lại tập tin /fckeditor/fckconfig.js

FCKConfig.DefaultLanguage = ‘vi’ ;

var _FileBrowserLanguage = ‘aspx’ ; // asp | aspx | cfm | lasso | perl | php | py

var _QuickUploadLanguage = ‘aspx’ ; // asp | aspx | cfm | lasso | perl | php | py

và fckconfig.js

cấu hình skin: FCKConfig.SkinPath = FCKConfig.BasePath + ‘skins/office2003/’;

6. Cấu hình lại tập tin /fckeditor/editor/filemanager/connectors/aspx/config.ascx

Chứng thực & gán giá trị trả về của hàm CheckAuthentication() là true.

Trong hàm SetConfig()

UserFilesPath = “/userfiles/”; chính là thư mục ~/userfiles/ chứa các tài nguyên cần upload lên (có thể thay đổi).

UserFilesAbsolutePath = “”;

Thay bằng:

UserFilesAbsolutePath = HttpContext.Current.Server.MapPath(“~/userfiles/”);

clip_image010[7]

7. Cấu hình web.config

<add tagPrefix=”fck” namespace=”FredCK.FCKeditorV2″ assembly=”FredCK.FCKeditorV2″ />

clip_image012[7]

8. Nếu website có dùng theme, tức có tồn tại thư mục App_Themes và / hoặc trong web.config có cấu hình:

<pages theme=”default”>

thì phải sửa tập tin /fckeditor/editor/filemanager/browser/default/browser.html

<head runat=”server”>

9. Tạo tập tin web.config trong thư mục fckeditor và thêm vào

clip_image014[7]

clip_image016[7]

<pages theme=”” />

10. Khởi tạo và dùng thử FCKEditor trong tập tin .aspx bất kỳ (ví dụ default.aspx)

<fck:FCKeditor ID=”FCKeditor2″

BasePath=”~/FCKeditor/”

ToolbarSet=”Default”

runat=”server”

/>

clip_image018[7]