ASP.NET_MVC (1) - Hệ sinh thái .NET

1         Hệ sinh thái .NET

1.1       Hệ sinh thái .NET là gì?

Hệ sinh thái hay hệ sinh thái công nghệ (ecoSystem) là một khái niệm ám chỉ một mạng lưới rộng khắp các thiết bị và dịch vụ, có khả năng liên kết chặt chẽ với nhau, bao gồm cả phần cứng và phần mềm. Khả năng đồng bộ dễ dàng, mang đến nhiều lợi ích cho người dùng trong công việc và giải trí.

Vậy hệ sinh thái .NET gồm những gì?

Xem hình minh họa sau:

Từ hình trên có thể thấy hệ sinh thái .NET gồm các thành phần:

– Common Infrastructure (Build Tools, Languages, Runtime Components)

– .NET Standard Library

– Các framework (.NET Framework, .NET Core, và Mono)

Trong đó, .NET Framework, .NET Core và Mono có thể xem là ba phiên bản khác nhau của hệ sinh thái .NET:

– .NET Framework: chỉ hoạt động trên Windows, cung cấp các nền tảng để tạo ứng dụng như: WPF, Winforms, ASP.NET, ASP.NET (Forms, MVC, web API)

– .NET Core: hoạt động theo hướng đa nền tảng, gồm Universal Windows Platform và ASP.NET Core

– Mono là phiên bản cộng đồng, nhằm đem .NET đến các nền tảng ngoài Windows. Mono gồm: Unity Game và Xamarin.

Áp dụng trong thực tế:

– Nếu làm ứng dụng chạy trên Windows (Desktop Application) thì sử dụng .NET Framework

– Nếu làm game dựa trên Unity hoặc ứng dụng di động dựa trên Xamarin thì sử dụng Mono

– Nếu làm web, ứng dụng web thì sử dụng .NET Framework hoặc .NET Core đều được

Xem một hình minh họa khác về hệ sinh thái .NET,



1.2       .NET Framework

Phần này chúng ta sẽ tìm hiểu một số thông tin về .NET Framework. Nó là 1 trong 3 framework phổ biến của hệ sinh thái .NET.

Xem hình minh họa về .NET Framework:




Web front-end (30) - CSS (3) - Tổng quan (bài tập & thực hành)

1.1       Bài tập và thực hành

Bài tập 1. Viết lại các đoạn mã trong phần lý thuyết.

Bài tập 2. This is HTML document in the file named cooking.html. You can get any picture to replace for salads.jpg (with dimensions are 300 x 200px).

[cooking.html]

<!doctype html>

<html>

<head>

<meta charset="UTF-8">

<title>Cooking with Nada Surf</title>

<style>

</style>

</head>

 

<body>

<h1>Cooking with Daniel from Nada Surf</h1>

 

<p>I had the pleasure of spending a crisp, Spring day in Portsmouth, NH cooking and chatting with Daniel Lorca of the band Nada Surf as he prepared a gourmet, sit-down dinner for 28 pals.</p>

 

<p>When I first invited Nada Surf to be on the show, I was told that Daniel Lorca was the guy I wanted to talk to. Then Daniel emailed his response: "i'm way into it, but i don't want to talk about it, i wanna do it." After years of only having access to touring bands between their sound check and set, I've been doing a lot of <em>talking</em> about cooking with rockstars. To actually cook with a band was a dream come true.</p>

 

<h2>Six-hour Salad</h2>

 

<p><img src="salads.jpg" alt="Smoked tomato salads on plates"></p>

 

<p>Daniel prepared a salad of arugula, smoked tomatoes, tomato jam, and grilled avocado (it's as good as it sounds!). I jokingly called it "6-hour Salad" because that's how long he worked on it. The fresh tomatoes were slowly smoked over woodchips in the grill, and when they were softened, Daniel separated out the seeds which he reduced into a smoky jam. The tomatoes were cut into strips to put on the salads. As the day meandered, the avocados finally went on the grill after dark. I was on flashlight duty while Daniel checked for the perfect grill marks.</p>

 

<p>I wrote up a streamlined adaptation of his recipe that requires <em>much</em> less time and serves 6 people instead of <em>five</em>times that amount.</p>

 

<h2>The Main Course</h2>

 

<p>In addition to the smoky grilled salad, Daniel served tarragon cornish hens with a cognac cream sauce loaded with chanterelles and grapes, and wild rice with grilled ramps (wild garlicky leeks). Dinner was served close to midnight, but it was a party so nobody cared.</p>

 

<p>We left that night (technically, early the next morning) with full bellies, new cooking tips, and nearly 5 hours of footage. I'm considering renaming the show "Cooking with Nada Surf". </p>

 

</body>

</html>

 

This is the web page displayed on the browser, when we don’t style yet.



Following these steps to style for web page:

– Open cooking.html in a text editor. In the head of the document you will find that I have set up a style element for you to type the rules into. The style element is used to embed a style sheet in an HTML document. To begin, we’ll simply add the small style sheet that we just looked at in this section. Type the following rules into the document, just as you see them here:

<style>

    h1 {

        color: green;

    }

    p {

        font-size: large;

        font-family: sans-serif;

    }

</style>

– Save the file, and take a look at it in the browser. You should notice some changes (if your browser already uses a sans-serif font, you may see only a size change). If not, go back and check that you included both the opening and closing curly bracket and semicolons. It’s easy to accidentally omit these characters, causing the style sheet not to work.

– Now we’ll edit the style sheet to see how easy it is to write rules and see the effects of the changes. Here are a few things to try.

IMPORTANT: Remember that you need to save the document after each change in order for the changes to be visible when you reload it in the browser.

– Make the h1 element “gray” and take a look at it in the browser. Then make it “blue”. Finally, make it “orange”.

– Add a new rule that makes the h2 elements orange as well.

– Add a 100-pixel left margin to paragraph (p) elements by using this declaration:

        margin-left: 100px;

Remember that you can add this new declaration to the existing rule for p elements.

– Add a 100-pixel left margin to the h2 headings as well.

– Add an orange, 1-pixel border to the bottom of the h1 element by using this declaration:

        border-bottom: 1px solid orange;

– Move the image to the right margin, and allow text to flow around it with the float property. The shorthand margin property shown in this rule adds zero pixels of space on the top and bottom of the image and 12 pixels of space on the left and right of the image.

    img {

        float: right;

        margin: 0 12px;

    }

When you are done, the document should look something like the one shown in below figure.



1.1       Câu hỏi ôn tập

Câu 1. CSS là viết tắt của các từ nào?

A. Code Style Sheets

B. Cascading Style Sheets

C. Cascading Style Source

D. Code Style Source

Câu 2. Quan sát đoạn mã p { color: red; font-size: 54px; }, theo thuật ngữ của CSS, phát biểu nào sau đây không đúng?

A. p là bộ chọn (selector)

B. Đoạn mã trên là một chỉ dẫn định dạng (style rule)

C. color là thuộc tính (property)

D. Đoạn mã trên là một khai báo (declaration)

Câu 3. Bạn có thể viết mã CSS ở đâu? Phát biểu nào sau đây không đúng?

A. Viết ở trong phần tử HTML, sử dụng thuộc tính style

B. Viết ở ngoài tài liệu HTML, trong tập tin .css, sử dụng phần tử link để liên kết

C. Viết ở trong tài liệu HTML, sử dụng phần tử <script>

D. Viết ở trong tài liệu HTML, sử dụng phần tử <style>

Câu 4. Theo kĩ thuật xếp lớp (cascading) trong CSS, loại mã CSS nào có độ ưu tiên cao nhất ?

A. User agent style sheet

B. User style sheet

C. Author style sheet

D. Cả ba có độ ưu tiên như nhau

Câu 5. Khi áp dụng đoạn mã CSS sau, văn bản p có màu gì?

<style>

p { color: purple; }

p { color: green; }

p { color: gray; }

</style>

A. Tím

B. Xanh

C. Xám

D. Trắng

Đáp án: 1(B), 2(D), 3(C), 4(C), 5(C)

-----

Cập nhật: 25/3/2023

-----

Bạn muốn tự học HTML bài bản? Xem thêm

Web front-end (29) - CSS (2) - Sự kế thừa, Xếp lớp

1.1       Sự kế thừa (Inheritance)

Bạn có đôi mắt, khuôn mặt, hay tính cách giống cha hoặc mẹ của bạn không? Nếu có, rất có thể bạn đã được kế thừa nó từ cha hoặc mẹ của bạn. Trong CSS cũng có tình huống kiểu như vậy, những gì chúng ta định dạng cho phần-tử-cha, thì mặc định, chúng cũng được định dạng cho các phần-tử-con. Tổng quát hơn, khi chúng ta định dạng CSS cho một phần tử, thì một số định dạng cũng áp dụng luôn cho các phần tử chứa trong nó.

Ví dụ,

[CSS]

        p {

            font-size: 41px;

            color: red;

        }

[HTML]

<p>Cuối tuần đi đá banh, giúp thêm <em>năng lượng</em> để làm việc</p>

Như bạn thấy, chúng ta chỉ định dạng cho phần tử p có cỡ chữ 41px và màu đỏ, chứ không định dạng cho phần tử em. Tuy nhiên, do em nằm trong p nên nội dung của em cũng có cỡ chữ 41px và màu đỏ.

Cấu trúc của tài liệu

Làm sao biết được phần tử nào chứa phần tử nào? Để biết được sự kế thừa giữa chúng? Như đã biết, tài liệu HTML đã ngầm chứa trong nó một cấu trúc phân cấp (hierarchy).

Ví dụ như tài liệu HTML trong Bài tập 2 (xem mục Bài tập và thực hành). Tài liệu có phần tử gốc là html chứa phần tử headbody. Phần tử body chứa các phần tử h1, h2p. Một số phần tử p lại chứa các phần tử kiểu inline như img, em. Một cách hình ảnh, tài liệu HTML chính là một cái cây lộn ngược (upside-down tree), với gốc là html, và các cành mọc xuống từ gốc. Xem hình minh họa,

Mối quan hệ giữa các nút trong cây-HTML

Để dễ hiểu, có thể xem mối quan hệ giữa các nút trong cây-HTML như là mối quan hệ trong một dòng tộc, mỗi phần tử HTML là một thành viên trong dòng tộc.

– Mọi phần tử nằm trong một phần tử thì được gọi hậu duệ (descendants) của nó. Ví dụ, các phần tử h1, h2, p, em, img được gọi là hậu duệ của phần tử body

– Phần tử chứa trực tiếp phần tử khác được gọi là cha (parent), các phần tử được-chứa gọi là con (child). Ví dụ, phần tử p chứa em, nên p là cha, em là con

– Với một phần tử bất kì, mọi phần tử ở mức cao hơn mà có mối liên hệ nội tộc (…ông-cha-con-cháu…) thì được gọi là tổ tiên (ancestors) của nó. Ví dụ, tổ tiên của imgp, body, html

– Hai phần tử có cùng cha thì được gọi là anh em (siblings), Ví dụ, h1, h2, p là anh em, vì đều có cha là body

Có thuộc tính được kế thừa, có thuộc tính không

Như ở bài tập đang xét, khi thiết lập định dạng font cho phần tử p, nó sẽ tác động lên mọi phần tử p của tài liệu HTML và các phần tử văn bản kiểu inline (em) nằm trong p. Có nghĩa là, phần tử em đã kế thừa thuộc tính định dạng font từ phần tử p. Tuy nhiên, phần tử img cũng nằm trong p nhưng sẽ không kế thừa thuộc tính định dạng font, vì hình ảnh thì không có thuộc tính font. Vậy là sẽ có một số thuộc tính được kế thừa và có một số thuộc tính thì không.

Xem hình minh họa,


Nói chung, các thuộc tính liên quan đến định dạng văn bản (ví dụ: font-size, color, style) thì sẽ được kế thừa, các thuộc tính liên quan đến borders, backgrounds, margins sẽ không được kế thừa.

Tính kế thừa có chọn lọc này rất hữu dụng trong một số tính huống, ví dụ nếu muốn thiết lập thuộc tính font cho tất cả các phần tử văn bản, thay vì phải thiết lập cho từng phần tử văn bản thì có thể thiết lập một lần cho phần tử body. Ngược lại, khi thiết lập thuộc tính border (đường biên) cho một phần tử p nào đó thì chắc chắn là không muốn có border cho cả các phần tử em, strong, hay a nằm ở trong nó.

Khi thiết lập thuộc tính cho một phần tử, nó sẽ ghi đè (override) lên thuộc tính được kế thừa tương ứng. Ví dụ, với phần tử em là con của phần tử p, nếu thiết lập phông chữ cho psans-serif và thiết lập phông chữ cho emserif  thì thuộc tính được áp dụng cho em sẽ là serif.

1.2       Kĩ thuật xếp lớp (Cascading)

Nhiều định dạng chồng chéo lên một phần tử HTML

Quay trở lại chữ CSS, nó là viết tắt của Cascading Style Sheets, hiểu nôm na “style sheets” là đoạn mã định dạng, thế còn “cascading” có nghĩa là gì?

Như ở các phần trước đã đề cập, kĩ thuật CSS cho phép viết mã định dạng ở 3 nơi khác nhau (trong phần tử HTML, trong tài liệu HTML và ngoài tài liệu HTML), vậy sẽ có tình trạng nhiều định dạng cùng áp lên một phần tử. Hoặc do tính kế thừa trong CSS, cũng sẽ dẫn tới tình trạng tương tự, một phần tử sẽ nhận được cùng lúc nhiều định dạng từ các phần tử cha, ông của nó.

Ví dụ: đoạn mã CSS trong style định dạng p có màu đỏ, đoạn mã CSS trong phần tử p định dạng p có màu xanh, vậy cuối cùng p có màu gì?

    <style>

        p {

            font-size: 41px;

            color: red;

        }

    </style>

<body>

    <p style="color: green">Cuối tuần đi đá banh, giúp thêm <em>năng lượng</em> để làm việc</p>

</body>

Hoặc, phần tử body được định dạng nền màu xám, p là con của body được định dạng nền màu vàng? vậy p sẽ có nền màu gì?

        body {

            background-color: gray;

        }

        p {

            font-size: 41px;

            color: red;

            background-color: yellow;

        }

    </style>

Để giải quyết tình huống: một phần tử HTML có nhiều định dạng cùng lúc, CSS sẽ sử dụng kĩ thuật xếp lớp (cascading).

Kĩ thuật xếp lớp là cách sắp xếp thứ tự các định dạng CSS (chỉ-dẫn-CSS) lên một phần tử HTML. Mỗi chỉ-dẫn-CSS được đánh trọng số ưu tiên (weight) hay độ ưu tiên, chỉ-dẫn-CSS nào có độ ưu tiên thấp sẽ định dạng lên phần tử HTML trước; chỉ-dẫn-CSS có độ ưu tiên cao hơn sẽ định dạng đè lên (overwrite) chỉ-dẫn-CSS có độ ưu tiên thấp hơn. Xem hình minh họa,



Độ ưu tiên được xác định dựa trên 3 yếu tố:

– Chỉ-dẫn-CSS từ đâu đến (priority of style source)

– Tính rõ ràng, chính xác của chỉ-dẫn-CSS (specificity)

– Thứ tự thực thi chỉ-dẫn-CSS (rule order)

Chỉ-dẫn-CSS từ đâu đến

CSS của trình duyệt

Như đã biết, nếu chúng ta không viết mã CSS để định dạng cho tài liệu HTML, thì trình duyệt sẽ lấy định dạng mặc định của nó để hiển thị trang web. W3C gọi kiểu định dạng này là user agent style sheet. Mỗi trình duyệt (ví dụ Chrome, Firefox) sẽ có bộ định dạng mặc định khác nhau. 

Ví dụ, bạn chỉ viết mã HTML cho trang index.html, không viết mã CSS.

[index.html]

<!doctype html>

<html>

<head>

    <meta charset="UTF-8">

    <title>Cooking with Nada Surf</title>

</head>

<body>

    <h1>Hi bac Teo!</h1>

</body>

</html>

Tuy nhiên, khi bạn sử dụng Developer tools để quan sát mã CSS thì sẽ thấy trang web đã được định dạng bằng CSS mặc định của trình duyệt.


CSS do người dùng tạo ra

 Trong quá trình duyệt web, người dùng có thể tự thiết lập chế độ hiển thị trang web theo ý của họ. Nói cách khác, họ tự CSS cho trang web (user style sheet). Các định dạng CSS này sẽ ghi đè lên kiểu định dạng mặc định của trình duyệt. Chúng ta sẽ thực hành cách CSS này trong Bài tập 3.

CSS do lập trình viên tạo ra

Nếu lập trình viên có viết mã CSS để định dạng cho tài liệu HTML (author style sheet), thì mã này sẽ có độ ưu tiên cao hơn mã CSS của người dùng và của trình duyệt.

Bảng sau cho biết độ ưu tiên của định dạng dựa trên nguồn CSS từ đâu đến? Thứ tự ưu tiên sẽ tăng dần từ trên xuống:

CSS mặc định của trình duyệt

CSS do người duyệt web định nghĩa

CSS do lập trình viên định nghĩa

Các định dạng CSS  do lập trình viên đánh dấu là “!important”

Các định dạng CSS do người duyệt web đánh dấu là “!important”

Tính rõ ràng, chính xác của chỉ-dẫn-CSS

Trong thực tế sẽ có tình huống: một phần tử HTML bị nhiều chỉ dẫn CSS áp dụng lên nó. Ví dụ, ở đoạn mã dưới đây, phần tử h1 được định dạng màu đỏ, phần tử có id=“tieu-de” được định dạng màu vàng; cả hai định dạng này đều áp dụng lên dòng chữ “Hi bac Teo!”. Vậy cuối cùng dòng chữ này có màu gì?

… 

   <style>

        h1 {

            color: red;

        }

        #tieu-de {

            color: yellow;

        }

    </style>

</head>

 

<body>

    <h1 id="tieu-de">Hi bac Teo!</h1>

</body>

Trong tình huống này, CSS quy định: khi hai (hay nhiều) chỉ dẫn trong một tài liệu CSS xung đột với nhau, thì sẽ dựa vào loại của bộ chọn (type of selector) để xác định độ ưu tiên. Bộ chọn nào càng rõ ràng, chính xác, và cụ thể (specificity) thì có độ ưu tiên cao hơn. Như ở ví dụ đang xét, bộ chọn h1 sẽ áp dụng cho tất cả mọi phần tử h1, như vậy ít có tính "cụ thể" bằng bộ chọn dựa trên định danh (#tieu-de). Kết quả là bộ chọn dựa trên định danh sẽ có độ ưu tiên cao hơn, và dòng chữ “Hi bac Teo!” sẽ có màu vàng.

Bạn có thể trải nghiệm về specificity tại trang web: https://specificity.keegan.st/

Thứ tự thực thi chỉ-dẫn-CSS (rule order)

Sau khi đã xem xét đến nguồn xuất phát và kiểu bộ chọn để xác định độ ưu tiên cho các định dạng CSS, thì vẫn có thể xảy ra trường hợp nhiều chỉ dẫn CSS cùng tác động lên một phần tử HTML, như trường hợp sau:

… 

   <style>

        h1 { color: red; }

        h1 { color: yellow; }

        h1 { color: green; }

    </style>

</head>

 

<body>

    <h1 id="tieu-de">Hi bac Teo!</h1>

</body>

Khi đó, CSS đưa ra quy tắc “cái nào gần đối tượng (HTML) cần định dạng hơn sẽ có độ ưu tiên cao hơn (cái cuối cùng sẽ có độ ưu tiên cao nhất)”. Vậy, h1 sẽ có màu xanh. Nếu để ý sẽ thấy, khi thực thi mã nguồn, trình duyệt sẽ thực hiện từ trên xuống dưới, từ trái sang phải. Mã CSS luôn xuất hiện trước phần tử HTML. Nên mã CSS càng gần phần tử HTML hơn càng được thực thi sau, và mã CSS cuối cùng sẽ định dạng đè lên các mã CSS trước đó.

Ví dụ dưới đây, màu vàng sẽ được áp dụng cho phần tử h1,

        h1 {

            color: red;

            color: green;

            color: yellow;

        }

Trong trường hợp sau, chỉ dẫn CSS trong tập tin main3.css sẽ có độ ưu tiên cao nhất.

    <link rel="stylesheet" href="main1.css">

    <link rel="stylesheet" href="main2.css">

    <link rel="stylesheet" href="main3.css">

-----

Cập nhật: 25/3/2023

-----

Bạn muốn tự học HTML bài bản? Xem thêm