Lessons in this course (10)

2. Pages, code-behind, server controls and events

Basic★ Must knowLesson 2 of 10
aspx
<%@ Page Title="Products" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
    CodeBehind="Products.aspx.cs" Inherits="ShopWeb.Products" %>

<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server">
    <asp:Label ID="lblMessage" runat="server" CssClass="text-success" />
    <asp:TextBox ID="txtName" runat="server" />
    <asp:RequiredFieldValidator runat="server" ControlToValidate="txtName" ErrorMessage="Name is required" Display="Dynamic" />
    <asp:DropDownList ID="ddlCategory" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlCategory_SelectedIndexChanged" />
    <asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" />
    <asp:GridView ID="gvProducts" runat="server" AutoGenerateColumns="false" DataKeyNames="Id">
        <Columns>
            <asp:BoundField DataField="Name" HeaderText="Name" />
            <asp:BoundField DataField="Price" HeaderText="Price" DataFormatString="{0:C}" />
        </Columns>
    </asp:GridView>
</asp:Content>
csharp
public partial class Products : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)       // AutoEventWireup="true" wires Page_Load by name
    {
        if (!IsPostBack)                                        // first visit only — otherwise you overwrite user input
        {
            ddlCategory.DataSource = ProductService.GetCategories();
            ddlCategory.DataBind();
            BindGrid();
        }
    }

    protected void ddlCategory_SelectedIndexChanged(object sender, EventArgs e) => BindGrid();

    protected void btnSave_Click(object sender, EventArgs e)
    {
        if (!Page.IsValid) return;                              // server-side validation result
        ProductService.Add(txtName.Text.Trim(), ddlCategory.SelectedValue);
        lblMessage.Text = "Saved";
        BindGrid();
    }

    private void BindGrid()
    {
        gvProducts.DataSource = ProductService.GetByCategory(ddlCategory.SelectedValue);
        gvProducts.DataBind();
    }
}

Control categories: HTML controls (<input> — plain), HTML server controls (<input runat="server"> — accessible in code), Web server controls (<asp:TextBox>), validation controls, data controls (GridView, Repeater, ListView, DetailsView, FormView), navigation (Menu, TreeView, SiteMapPath), login controls, user controls (.ascx) and custom controls.

Inline code expressions: <%= value %> (write, not encoded), <%: value %> (HTML-encoded — use this), <%# Eval("Name") %> (data binding), <%$ ConnectionStrings:Shop %> (expression builder).