Đỉnh NGUYỄN

life's a journey not a destination


Leave a comment

Ủy nhiệm (Event Delegation) trong ASP.NET : Phát sinh sự kiện từ User Control đến Parent Page


Delegate là gì? MọI ngườI thường hay gặp câu hỏI này khi còn ngồI trên ghế nhà trường và trong các cuộc phỏng vấn; câu trả lờI phổ biến là con trỏ hàm (function pointer). Trong phát triển Web, đây là kỹ thuật phổ biến để giao tiếp giữa các thành phần của Web (bản thân các hàm sự kiện của các controls được xây dựng sẵn trong ASP.NET đều dùng kỹ thuật này).

Ví dụ vớI 1 trang .ASPX và 1 User Control. User Control có 1 Button và khi click vào button này sẽ gọI 1 hàm trên trang .ASPX dùng delegate.

User Control:

C#

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Widget.ascx.cs" Inherits="Widget" %>

<asp:Button ID="btnTest" runat="server" 
    Text="I am Inside User Control" OnClick="btnTest_Click" />

Trên Widget.aspx.cs, viết xử lý sự kiện Delegate như sau:

Code-Behind

using System;

public partial class Widget : System.Web.UI.UserControl
{
    // Delegate declaration 
    public delegate void OnButtonClick(string strValue);
    // Event declaration 
    public event OnButtonClick btnHandler;
    
    // Page load 
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    
    protected void btnTest_Click(object sender, EventArgs e)
    {
        // Check if event is null 
        if (btnHandler != null)
            btnHandler(string.Empty);
        // Write some text to output 
        Response.Write("User Control’s Button Click <BR/>");
    }

}

Đoan code trên kiểm tra btnHandler khác null, phát sinh sự kiện bằng cách truyền đốI số

Trang .ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register Src="~/Widget.ascx" TagName="Widget" TagPrefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblText" Text="I am On Main Page : " runat="server" />
        <asp:DropDownList ID="ddlTemp" runat="server">
            <asp:ListItem>Google</asp:ListItem>
            <asp:ListItem>Microsoft</asp:ListItem>
            <asp:ListItem>Apple</asp:ListItem>
        </asp:DropDownList>
        <br />
        <br />
        <uc1:Widget ID="Widget1" runat="server" />
    </div>
    </form>
</body>
</html>

Code-Behind

using System;

public partial class _Default : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        // Declare and Define Event of User Control. When User Clicks on button 
        //(which is inside UserControl) 
        // below event is raised as I have called raised that event on Button Click 
        Widget1.btnHandler += new
            Widget.OnButtonClick(WebUserControl1_btnHandler);
    }

    void WebUserControl1_btnHandler(string strValue)
    {
        Response.Write("Main Page Event<BR/>Selected Value: " +
                    ddlTemp.SelectedItem.Text + "<BR/>");
    }

}
Advertisements


Leave a comment

Hai điểm mới trong C# 4.0


Hai điểm mới trong C# 4.0 là .Các tham số tùy ý là 1 phần của VB.NET, và giờ đây đã được thêm vào C#. Thay vì dùng nạp chồng phương thức, bạn có thể viết mã C# như sau:

private string SomeMethod(string givenName, string surname = "Sheridan", int age = 10)
{
      return givenName + " " + surname;
}

Tham số thứ 2 và thứ 3 (surname & age), cả hai đều được gán trị mặc định. Chỉ có tham số đầu tiên (giveName) là buộc phải có. Để gọi phương thức này bạn có thể viết như sau:

string name = null;
name = SomeMethod("Malcolm");

Cũng có thể viết như sau:

string name = null;
name = SomeMethod("Suprotim", "Agarwal");
string name = null;
name = SomeMethod("Suprotim", age: 20);


Leave a comment

Những điểm mới trong ASP.NET 4.0


Với Visual Studio 2010 Beta 1 và .NET Framework 4.0 Beta
1, ASP.NET 4.0 có rất nhiều sự cải tiến về Webforms, Dynamic Data &
Ajax, nâng cao hiện suất môi trường chạy (runtime) như Caching, Session
& các đối tượng Request/Response.

Một số đặc tính mới:

Điều khiển View State
dùng thuộc tính ViewStateMode – Cải thiện hiệu suất

Một trong những điều được phàn nàn nhiều trong
ASP.NET Webforms là hiệu suất của View State. Những phiên bản trước,
bạn chỉ có thể gán thuộc tính EnableViewState là true hoặc false, tất
cả các điều khiển mặc định sẽ kế thừa.

Với ASP.NET 4.0, thuộc tính ViewStateMode cho phép gán
trên mỗi điều khiển, ViewState sẽ có thển enabled, disabled, inherted.

<asp:Panel ID="pnlViewState" runat="server" ViewStateMode="Disabled">
      Disabled:
<asp:Label ID="label1" runat="server" 
Text="Value set in markup"
ViewStateMode="Inherit"  /><br />
          
Enabled: <asp:Label ID="label2"  runat="server"
Text="Value set in markup"
ViewStateMode="Enabled" />
  <hr />
  <asp:button
ID="Button1" runat="server"  Text="Postback"
/>

    </asp:Panel>

Trong code-behind

protected void Page_Load(object sender, EventArgs e)
    {
       
if (!IsPostBack)

       
{

           
label1.Text = "Value set in code behind";

           
label2.Text = "Value set in code behind";

       
}

    }

Khi chạy trang web trên, giá trị khởi tạo cho cả 2
label là “Value set in code behind”; sau khi nhấn nút (postback), giá trị
label1 sẽ thay đổi thành “Value set in markup”, trong khi giá trị của
label2 vẫn không thay đổi. Như bạn thấy, Panel chứa cả 2 labels có
thuộc tính ViewStateMode được gán là Disabled, và label1 kế thừa giá
trị thuộc tính ViewStateMode từ Panel (mặc định nếu không được gán), trong
khi label2 được gán là Enabled. Đó là lý do label2 vẫn duy trì
ViewState trong khi label1 mất.

Page meta keyword và
description – Search engine optimization feature

Visual Studio 2008, có thể gán tiêu đề (title) của
trang trong thẻ khai báo đầu trang hoặc trong mã code-behind (Page.Title).
Tuy nhiên, Đối với các search engine, Title, Keyword và Description là
rất quan trọng.

Đặc điểm mới trong ASP.NET 4.0 cho phép người dùng lập
trình Description và Keyword như sau:

With Visual
Studio 2010 Beta 1 and .NET Framework Beta 1 out for some time, this post is
due from me for a long time.   ASP.NET 4.0 has many improvements for
different set of scenarios such as Webforms, Dynamic Data & AJAX based web
development.  There are also a lot of enhancements to the core runtime
that powers ASP.NET such as Caching, Session & Request/Response objects.

For this post,
we will examine some of the web form enhancements.  There are sure a lot
of them and we will examine some of them in the future posts.

Controlling
View State using the ViewStateMode Property – Performance Enhancement

One of the most
complained thing in ASP.NET Webform is the growing viewstate which becomes a
concern for performance.  While earlier you can set the EnableViewState
property to true or false, post that, all the controls, by default inherit and
even if you set it to enabled at control level, the behaviour was inconsistent.

With ASP.NET
4.0, the ViewStateMode property helps to determine for every control, whether
the ViewState should be enabled, disabled or inherited accordingly.  Ex.-

<asp:Panel
ID="pnlViewState" runat="server"
ViewStateMode="Disabled">
      Disabled:
<asp:Label ID="label1" runat="server" 
Text="Value set in markup"
ViewStateMode="Inherit"  /><br />
          
Enabled: <asp:Label ID="label2"  runat="server"
Text="Value set in markup"
ViewStateMode="Enabled" />
  <hr />
  <asp:button
ID="Button1" runat="server"  Text="Postback"
/>

    </asp:Panel>

In the
code-behind

protected
void Page_Load(object sender, EventArgs e)

    {
       
if (!IsPostBack)

       
{

           
label1.Text = "Value set in code behind";

           
label2.Text = "Value set in code behind";

       
}

    }

When you run
the above page, you can find that the intial value for both the labels is set
to “Value set in code behind” whereas after clicking on the button (postback),
the value of label1 changes to “Value set in markup” whereas the value of
label2 remains unchanged.  As you can see, the Panel which holds both
these lables has ViewStateMode set to Disabled and label1 is inherting the mode
(this is the default if not specified) and label2 has it enabled.  That is
the reason label2 maintains viewstate while label1 loses it.

While it is
arguably possible using the simple EnableViewState property earlier, it was
never consistent.  Considering the fact that in most of our performance
sessions, we talk about disabling viewstate and then enabling it at control
level while it doesnt work, this ViewStateMode is a welcome architectural
change to improve performance.

Page
Meta Keyword & Description – Search Engine Optimization feature

Upto Visual
Studio 2008, one can set the Title of the page declaratively or through program
using Page.Title.  However, as more and more web traffic is happening
through search engines, Page’s Title, Keyword and description become more
important.  Although the Keyword feature was exploited and hence many
search engines today ignore it, Page Description is something still major search
engines such as Google, Bing use for identifying and indexing pages based on
content.

The new feature
in ASP.NET 4.0 allows users to programmatically set the Page Description and
Keywords as follows:-

protected
void Page_Load(object sender, EventArgs e)

    {
       
this.Page.Title = "My ASP.NET Blog";

       
this.Page.MetaKeywords = "ASP.NET, Web Development, Blog, ASP.NET
Blog";

       
this.Page.MetaDescription = "This Blog contains posts related to ASP.NET
and Web Development";

    }

Đoạn mã ở trên kèm theo mã đánh dấu sau:

<meta
name="keywords" content="ASP.NET, Web Development, Blog, ASP.NET
Blog" />

<meta
name="description" content="This Blog contains posts related to
ASP.NET and Web Development" />

Mặc dù trông đơn giản, rất hữu dụng trong trường hợp
muốn gán động nội dung dựa trên điều kiện

Cheers!!!


Leave a comment

Security (C# Programming Guide)


Security cần thiết cho mỗi ứng dụng C#, và phải được xem xét trong mỗi giai đoạn của quá trình phát triển phần mềm (phase), chứ không riêng gì thiết kế hay cài đặt hay làm xong rồi mới kiểm tra bảo mật.

C# Specific Security Recommendations

Đây không phải danh sách toàn diện về những vấn đề bảo mật tiềm tàng. Trọng tâm và những vấn đề phổ biến và hay mắt phải trong khi phát triển.

– Dùng từ khóa checked để điều khiển để kiểm tra overflow các toán tử và sự chuyển đổi toán học.

– Luôn dùng các kiểu dữ liệu hạn chế tham số. Ví dụ, khi truyền giá trị cho phương thức để mô tả kích thước cấu trúc dữ liệu, dùng unsinged interger thay vì integer (vì kích thước không âm). Các bạn thường lạm dụng int

– Không nên quyết định dựa trên tên tập tin. Tên tập tin có thể diễn tã theo rất nhiều cách khác nhau.

– Đừng bao giờ đưa password hay các thông tin nhạy cảm vào mã

– Kiểm chứng (validate) tất cả dữ liệu nhập vào mỗi phương thức. System.Text.RegularExpressions có ích để đảm bảo dữ liệu nhập đúng định dạng, như địa chỉ email chẳng hạn.

– Không được hiện thông tin exception: nó cung cấp thông tin cho kẻ tấn công

– Chắc rằng ứng dụng chạy trong quyền hạn ít nhất có thể mà vẫn đảm bảo yêu cầu. Nhiều ứng dụng bắt buộc user phải login.

– Không được dùng thuật toán mã hóa của chính bạn. Hãy dùng System.Security.Cryptopraphy

– Không lưu thông tin nhạy cảm trong tập tin xml và config

– Kiểm tra managed code có bao đóng native code không, 1 cách hết sức cẩn thận. Chắc rằng native code được bảo đảm

– Chạy Visual Studio Code Analysys để phân tích, dò và sửa managed code.

– Microsoft FX Cop sẽ hữu dụng khi tìm lỗi bảo mật trong assembly (chỉ có từ Visual Studio 2008)


Leave a comment

Reflection (C# Programming Guide)


Reflection cung cấp đối tượng (thuộc kiểu Type), mô tả assemblies, modules và types. Dùng reflection tạo động 1 thể hiện của Type, lấy Type từ đối tượng đã tồn tại và triệu gọi các phương thức hoặc truy cập các thuộc tính. Nếu có dùng thuộc tính trong mã, reflection cho phép truy cập chúng. (Reflection class cung cấp các phương thức đọc assembly meta data cho hộp thoại About là ví dụ điển hình). Thông tin xem thêm Attributes (C# Programming Guide).

Một ví dụ reflection dùng phương thức static GetType – được kế thừa từ lớp Object

// Using GetType to obtain type information:
int i = 42;
System.Type type = i.GetType();
System.Console.WriteLine(type);

Dữ liệu xuất:

System.Int32

Một ví dụ, reflection lấy fullname của 1 assembly được load.

// Using Reflection to get information from an Assembly:
System.Reflection.Assembly o = System.Reflection.Assembly.Load("mscorlib.dll");
System.Console.WriteLine(o.GetName());

Dữ liệu xuất:

mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Chú ý: Từ khóa C#: protected, internal không mang ý nghĩa trong IL, và không dùng trong Reflection APIs. Thuật ngữ IL gồm Family và Assembly. Để xác định phương thức nào là internal, dùng thuộc tính IsAssembly. Để xác định protected internal methods, dùng IsFamillyOrAssembly.

Situlations

Reflection dùng trong các tình huống

– Khi truy cập thuộc tính trong meta data của chương trình (xml). Xem thêm Accessing Attributes With Reflection (MSDN Online).

– Khảo sát và minh họa về types trong assembly

– Xây dựng các types mới lúc chạy chương trình. Dùng class System.Reflection.Emit

– Xem thêm Dynamically Loading and Using Types.


Leave a comment

Performance (C# Programming Guide)


Boxing & Unboxing

Boxing & Unboxing rất tốt chi phí xử lý. Khi 1 giá trị được boxed, một đối tượng mới hoàn toàn sẽ được tạo ra. Điều này tốn chi phí xử lý gấp 20 lần 1 phép gán. Khi unboxing, quá trình cast tốn chi phí xử lý gấp 4 lần 1 phép gán. Thông tin thêm xem Boxing & Unboxing (MSND Online).

Destructors

Hoặc không viết destructor hoặc viết destructor rỗng sẽ không có ý nghĩa. Khi lớp chứa 1 destructor, 1 thực thể tạo ra trong hàng đợi Finalize. Khi destructor được gọi, trình gom rác (garbage collector) được gọi để xử lý hàng đợi. Nếu destructor rỗng, sẽ làm giảm hiệu suất chương trình. Thông tin thêm xem Destructors (MSDN Online).

Other Resources

Writing Faster Managed Code: Know What Things Cost.

Writing High-Performance Managed Applications: A Primer

Garbage Collector Tips & Tricks in .NET Applications.