Built-In Indexers

Introduction

To assist you with a faster means of using indexers in your code, some of the classes in the .NET Framework are equipped with indexed properties. The most fundamental of these classes is the String. It allows you to access each of its characters as an array.

This is another version of a web project for a fictitious company that makes and sells office chairs. Each chair has a weight and a price per unit. A customer can order a certain number of chairs, which results in a calculated sub-total (the number of chairs multiplied by the price of a chair). When a customer places an order, a discount is based on the sub-total amount of the order. The shipping and handling of a customer order is based on the total weight of the chairs ordered.

Practical LearningPractical Learning: Introducing Collection Topics

  1. Start Microsoft Visual Studio
  2. On the main menu, click File -> New -> Project ...
  3. In the New Project dialog box, make sure ASP.NET Web Application (.NET Framework) is selected. Change the Name to ChairExecs4
  4. Press Enter
  5. In the New ASP.NET Web Application dialog box, click the MVC icon and click OK
  6. In the Solution Explorer, right-click ChairExecs4 -> Add -> New Folder
  7. Type Images
  8. Copy and paste the following pictures to the Images folder:

    Background Picture
    Chair Chair Chair
  9. In the Solution Explorer, right-click Content -> Add -> New Item...
  10. In the Add New Item dialox box, click Style Sheet and change the file Name to ChairExecs
  11. Click Add
  12. Change the document as follows:
    body {
        background-color: #FFFFFF;
    }
    .bottom-bar         { left:                       0;
                          right:                      0;
                          bottom:                     0;
                          margin-bottom:              0;
                          position:                   fixed;
                          background-color:           #033e65;
                          border-top:                 6px solid #e0a43a; }
    .top-banner         { margin:                     auto;
                          min-width:                  800px;
                          max-width:                  1150px;
                          height:                     15.50em;
                          border-bottom-left-radius:  30px;
                          border-bottom-right-radius: 30px;
                          border-bottom:              30px;
                          background-color:           #033e65;
                          border-left:                2px solid #efebeb;
                          border-right:               2px solid #efebeb;
                          background-image:           url(../Images/bg1.png) }
    .top-table          { margin-top:                 0px;
                          margin-left:                50px;
                          width:                      800px;             }
    .copyright          { color:                      aliceblue;
                          text-align:                 center;            }
    .col-md-3 > h4      { color:                      #e0eaf2;
                          margin-left:                40px;              }
    .col-md-3 > h4 > ul { list-style-type:            none;              }
    .bottom-row         { margin:                     auto;
                          min-width:                  800px;
                          max-width:                  1150px;            }
    .navbar-fixed-top   { height:                     12.50em;
                          background-color:           #033e65;
                          border-bottom:              3px solid #000000; }
    .jumbotron          { padding-top:                180px;
                          padding-bottom:             10px;
                          background-color:           #FFF;              }
    .jumbotron h1       { color:                      #0a2dd5;           }
    .lead               { color:                      #071b96;           }
    .col-head           { font-weight:                600;
                          font-size:                  18px;
                          color:                      #800000;           } 
  13. In the Solution Explorer, expand Views and expand Home
  14. Under Views, double-click Index.cshtml to open it
  15. Change the document as follows:
    @{
        ViewBag.Title = "Welcome to Chair Executives";
    }
    
    <div class="jumbotron">
        <p class="lead">
            At Chair Executives, we design, create, manufacture, and care for 
            comfortable chairs for home offices, schools, small businesses, enterprises, 
            and government environments. Through rigorous research and tests, we  
            understand what various users look for in a chair. We certainly 
            know and have what it takes to fulfill your long seating needs.
        </p>
    </div>
    
    <table style="width: 100%">
        <tr>
            <td colspan="2" style="width: 33%"><P class="col-head">Attentive Seating</P></td>
            <td colspan="2" style="width: 33%"><P class="col-head">Spirit of Monarchy</P></td>
            <td colspan="2" style="width: 100%"><P class="col-head">Confidence n&#039; Management</P></td>
        </tr>
        <tr>
            <td><img src="~/Images/chair1a.png" /></td>
            <td>
                <p>This introductory chair&#039;s primary goal is to serve short-seating 
                   periods (such as job interviews or classroom teachers) environments 
                   not concerned with rough use.</p>
            </td>
            <td><img src="~/Images/chair1b.png" alt="Business Chairs" /></td>
            <td>
                <p>This is our intermediate chair aimed at business offices, enterprises, 
                   and the government. This category of chairs provide warmth comfort for long use.
                </p>
            </td>
            <td><img src="~/Images/chair1c.png" alt="Business Chairs" /></td>
            <td>
                <p>Our top executive chair provides the ultimate comfort. Its goal is 
                   to assist business managers and supervisors who must spend long 
                hours seating and making important decisions.</p>
            </td>
        </tr>
    </table>
  16. In the Solution Explorer, under Views, expand Shared and double-click Layout.cshtml
  17. Change the file as follows:
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - Chair Executives</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
    <link rel="stylesheet" type="text/css" href="~/Content/ChairExecs.css" />
    </head>
    <body>
    <div class="navbar-fixed-top">
        <div class="top-banner">
            &nbsp;
            <table class="top-table">
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td rowspan="7"></td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>@Html.ActionLink("Home", "Index", "Home")</td>
                    <td>@Html.ActionLink("Our Brand", "OurBrand", "Home")</td>
                    <td>@Html.ActionLink("School Deals", "SchoolDeals", "Home")</td>
                </tr>
                <tr>
                    <td>@Html.ActionLink("About Us", "About", "Home")</td>
                    <td>@Html.ActionLink("Our Materials", "LearnMore", "Home")</td>
                    <td>@Html.ActionLink("Small Business Deals", "SmallBusinessDeals", "Home")</td>
                </tr>
                <tr>
                    <td>@Html.ActionLink("Contact Us", "Contact", "Home")</td>
                    <td>@Html.ActionLink("Our Designs", "CurrentSales", "Home")</td>
                    <td>@Html.ActionLink("Enterprise Deals", "EnterpriseDeals", "Home")</td>
                </tr>
                <tr>
                    <td>@Html.ActionLink("Customer Service", "CustomerService", "Home")</td>
                    <td>@Html.ActionLink("Our Customers", "Customers", "Home")</td>
                    <td>@Html.ActionLink("Government Deals", "GovernmentDeals", "Home")</td>
                </tr>
            </table>
        </div>
    </div>
    
    <div class="container body-content">
            @RenderBody()
            <hr />
            <footer class="bottom-bar">
                <div class="bottom-row">
                    <div class="col-md-3">
                        <h4>Departments</h4>
                        <ul>
                            <li>@Html.ActionLink("Shop by Category", "Category", "Shop")</li>
                            <li>@Html.ActionLink("Shop by Brand", "Brand", "Shop")</li>
                            <li>@Html.ActionLink("Shop by Material", "Material", "Shop")</li>
                            <li>@Html.ActionLink("Shop by Environment", "Environment", "Shop")</li>
                        </ul>
                    </div>
                    <div class="col-md-3">
                        <h4>Accounts</h4>
                        <ul>
                            <li>@Html.ActionLink("Login", "Personal", "Home")</li>
                            <li>@Html.ActionLink("Register/Create Account", "School", "Home")</li>
                            <li>@Html.ActionLink("Club Membership", "Membership", "Home")</li>
                            <li>@Html.ActionLink("Privacy Issues", "Index", "Home")</li>
                        </ul>
                    </div>
                    <div class="col-md-3">
                        <h4>Solutions</h4>
                        <ul>
                            <li>@Html.ActionLink("Classic", "Index", "Home")</li>
                            <li>@Html.ActionLink("Exotic", "About", "Home")</li>
                            <li>@Html.ActionLink("Essentials", "Contact", "Home")</li>
                            <li>@Html.ActionLink("Ergonomic Economy", "Index", "Home")</li>
                        </ul>
                    </div>
                    <div class="col-md-3">
                        <h4>Relations</h4>
                        <ul>
                            <li>@Html.ActionLink("Public relations", "Index", "Home")</li>
                            <li>@Html.ActionLink("Press Releases", "About", "Home")</li>
                            <li>@Html.ActionLink("Legislations/Regulations", "Contact", "Home")</li>
                            <li>@Html.ActionLink("Newsletter Subscription", "Index", "Home")</li>
                        </ul>
                    </div>
                    <hr />
                    <p class="copyright">&copy; @DateTime.Now.Year - Chair Executives</p>
                </div>
            </footer>
        </div>
    
        @Scripts.Render("~/bundles/jquery")
        @Scripts.Render("~/bundles/bootstrap")
        @RenderSection("scripts", required: false)
    </body>
    </html>
  18. To execute the project, on the main menu, click Debug -> Start Without Debugging

    Delegates and Parameters

  19. Close the browser and return to your programming environment
  20. In the Solution Explorer, right-click Controllers -> Add -> New Scaffolded Item...
  21. In the Add Scaffold dialog box, click MVC 5 Controller - Empty
  22. Click Add
  23. Type Business to get BusinessController
  24. Click Add
  25. Add a method as follows:
    using System.Web.Mvc;
    
    namespace ChairExecs4.Controllers
    {
        public class BusinessController : Controller
        {
            // GET: Business
            public ActionResult Index()
            {
                return View();
            }
    
            // GET: Business/StartCustomerOrder
            public ActionResult StartCustomerOrder()
            {
                return View();
            }
        }
    }

Introduction to Requesting a Value

We alreaddy know that the webserver (IIS) has its own libraries. One of the classes on that library is named HttpRequest. That class allows you to read values that a browser carries.

To support HTTP requests, ASP.NET provides a class named HttpRequestBase. The HttpRequestBase class is an ASP.NET adaptation of the HttpRequest class. Both classes practically behave the same.

A Requested Value in a Controller

A controller can receive a value as an HTTP request from a browser. The controller may need to appropriately analyse and convert that value before processing it. To support this operation, the Controller class is equipped with a property named Request:

public HttpRequestBase Request { get; }

To let you get the value of a request, the HttpRequest class is equipped with a property named QueryString. Therefore, to get the value of a control, pass its name to the square brackets of this property. As an alternative, you can omit the QueryString property. In this case, to get the value of the request, type Request[]. In the square brackets, provide the value as a string.

The controller can receive a request through a parameter to an action.

Practical LearningPractical Learning: Requesting Values in a Controller

  1. Change the BusinessController.cs as follows:
    using System.Web.Mvc;
    
    namespace ChairExecs4.Controllers
    {
        public class BusinessController : Controller
        {
            // GET: Business
            public ActionResult Index()
            {
                return View();
            }
    
            // GET: Business/StartCustomerOrder
            public ActionResult StartCustomerOrder()
            {
                return View();
            }
    
            public ActionResult PrepareCustomerOrder(string Type1Name, string Type1UnitWeight, string Type1UnitPrice, string Type1Quantity,
                                                     string Type2Name, string Type2UnitWeight, string Type2UnitPrice, string Type2Quantity,
                                                     string Type3Name, string Type3UnitWeight, string Type3UnitPrice, string Type3Quantity)
            {
                int iType1Weight = int.Parse(Request["Type1UnitWeight"]);
                int iType1Quantity = int.Parse(Request["Type1Quantity"]);
                double dType1UnitPrice = double.Parse(Request["Type1UnitPrice"]);
    
                int iType2Weight = int.Parse(Request["Type2UnitWeight"]);
                int iType2Quantity = int.Parse(Request["Type2Quantity"]);
                double dType2UnitPrice = double.Parse(Request["Type2UnitPrice"]);
    
                int iType3Weight = int.Parse(Request["Type3UnitWeight"]);
                int iType3Quantity = int.Parse(Request["Type3Quantity"]);
                double dType3UnitPrice = double.Parse(Request["Type3UnitPrice"]);
    
                return View();
            }
        }
    }
  2. In the document, right-click anywhere inside the StartCustomerOrder() method and click Add View
  3. Make sure the text box displays StartCustomerOrder and click Add
  4. Change the document as follows:
    @{
        ViewBag.Title = "New Customer Order";
    }
    
    <div align="center">
        <h2 style="margin-top: 6.5em">New Customer Order</h2>
    
        @using (Html.BeginForm("PrepareCustomerOrder", "Business", FormMethod.Post))
        {
            <table>
                <tr>
                    <td style="width: 120px"><b>Item Name</b></td>
                    <td><b>Weight</b></td>
                    <td><b>Unit Price</b></td>
                    <td><b>Quantity</b></td>
                </tr>
                <tr>
                    <td>@Html.TextBox("Type1Name", "Demeanor")</td>
                    <td>@Html.TextBox("Type1UnitWeight", "16", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type1UnitPrice", "64.95", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type1Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
                <tr>
                    <td>@Html.TextBox("Type2Name", "Scholar")</td>
                    <td>@Html.TextBox("Type2UnitWeight", "32", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type2UnitPrice", "104.45", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type2Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
                <tr>
                    <td>@Html.TextBox("Type3Name", "Executive")</td>
                    <td>@Html.TextBox("Type3UnitWeight", "36", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type3UnitPrice", "154.55", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type3Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
            </table>
    
            <hr />
    
            <p style="text-align: center; width: 500px">
                <input type="submit" name="btnPrepareCustomerOrder"
                       value="Prepare Customer Order" style="width: 300px" />
            </p>
        }
    </div>

Requesting a Value in a View

When you create a form in a webpage and add some controls to it, you subsequently create a dictionary-based collection where, as we learned already about this type of list, each item is represented as key=value. Each key is the target that will receive the value of the control. Such a key can be a variable, another control, or any left-hand operand. A value can come from a control. The value is provided as an indexer.

To give you access to the collection of controls of a form, the WebPageRenderingBase class (an ancestor of webpages) is equipped with a property named Request. This property is of type HttpRequestBase:

public virtual HttpRequestBase Request { get; }

To get the value of a control from a form, you can apply the QueryString property of the HttpRequest class. Therefore, to get the value of a control, pass its name to the square brackets of this property. You can then assign that value to a string or a variable. Here is an example:

@{
    ViewBag.Title = "Employment Application";

    string strEmployeeName = string.Empty;

    if (IsPost)
    {
        strEmployeeName = Request.QueryString["txtEmployeeName"];
    }
}

<h2>Employment Application</h2>

@using (Html.BeginForm())
{
    <p>Employee Name: @Html.TextBox("txtEmployeeName")</p>
}

Instead of going through the QueryString property, you can apply the square brackets directly to the Request property.

Viewing Data

Generating Data from a Controller

The ViewBag object allows you to transfer one value at a time from a controller to a view. As an alternative, to give you the ability to transfer a value as a key/value pair, the ControllerBase class is equipped with a property named ViewData. This property is based on a dictionary-based collection class named ViewDataDictionary:

public ViewDataDictionary ViewData { get; set; }

To use a ViewData object, you never have to declare a ViewDataDictionary variable. Instead, the object is already a member of the controller or the view.

The ViewData property follows the logic of an item of a dictionary-based collection. To use this property, in the method associated with the view where you will access the value, type ViewData followed by square brackets. Inside the brackets, pass a one-word name of your choice, as a string. Then assign the desired value. You can use the same technique to create as many values as you want.

Practical LearningPractical Learning: Generating Data from a Controller

  1. Click the BusinessController.cs tab to access it
  2. Change the document as follows:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace ChairExecs4.Controllers
    {
        public class BusinessController : Controller
        {
            // GET: Business
            public ActionResult Index()
            {
                return View();
            }
    
            // GET: Business/StartCustomerOrder
            public ActionResult StartCustomerOrder()
            {
                return View();
            }
    
            public ActionResult PrepareCustomerOrder(string Type1Name, string Type1UnitWeight, string Type1UnitPrice, string Type1Quantity,
                                                     string Type2Name, string Type2UnitWeight, string Type2UnitPrice, string Type2Quantity,
                                                     string Type3Name, string Type3UnitWeight, string Type3UnitPrice, string Type3Quantity)
            {
                int iType1Weight = int.Parse(Request["Type1UnitWeight"]);
                int iType1Quantity = int.Parse(Request["Type1Quantity"]);
                double dType1UnitPrice = double.Parse(Request["Type1UnitPrice"]);
    
                int iType2Weight = int.Parse(Request["Type2UnitWeight"]);
                int iType2Quantity = int.Parse(Request["Type2Quantity"]);
                double dType2UnitPrice = double.Parse(Request["Type2UnitPrice"]);
    
                int iType3Weight = int.Parse(Request["Type3UnitWeight"]);
                int iType3Quantity = int.Parse(Request["Type3Quantity"]);
                double dType3UnitPrice = double.Parse(Request["Type3UnitPrice"]);
    
                int type1TotalWeight = 0, type2TotalWeight = 0, type3TotalWeight = 0;
    
                if (iType1Quantity == 0)
                    type1TotalWeight = 0;
                else
                    type1TotalWeight = iType1Weight * iType1Quantity;
    
                if (iType2Quantity == 0)
                    type2TotalWeight = 0;
                else
                    type2TotalWeight = iType2Weight * iType2Quantity;
    
                if (iType3Quantity == 0)
                    type3TotalWeight = 0;
                else
                    type3TotalWeight = iType3Weight * iType3Quantity;
    
                ViewData["Type1Quantity"] = Type1Quantity;
                ViewData["Type2Quantity"] = Type2Quantity;
                ViewData["Type3Quantity"] = Type3Quantity;
                ViewData["Type1SubTotal"] = dType1UnitPrice * iType1Quantity;
                ViewData["Type2SubTotal"] = dType2UnitPrice * iType2Quantity;
                ViewData["Type3SubTotal"] = dType3UnitPrice * iType3Quantity;
                ViewData["Type1TotalWeight"] = type1TotalWeight;
                ViewData["Type2TotalWeight"] = type2TotalWeight;
                ViewData["Type3TotalWeight"] = type3TotalWeight;
                ViewData["TotalWeight"] = iType1Weight + iType2Weight + iType3Weight;
    
                return View();
            }
        }
    }

Viewing Data in a View

After creating a ViewData value or object, to access it, in the view associated with the method, type ViewData and its square brackets. In the square brackets, pass the name you had used.

Practical LearningPractical Learning: Viewing Data in a View

  1. In the document, right-click inside the PrepareCustomerOrder() method and click Add View...
  2. Make sure the text box displays PrepareCustomerOrder and click Add
  3. Change the document as follows:
    @{
        ViewBag.Title = "Prepare Customer Order";
    }
    
    @{
        double discountRate = 0.00, shipping = 0.00;
    
        double subTotal1 = double.Parse(ViewData["Type1SubTotal"].ToString());
        double subTotal2 = double.Parse(ViewData["Type2SubTotal"].ToString());
        double subTotal3 = double.Parse(ViewData["Type3SubTotal"].ToString());
    
        double totalWeight = double.Parse(ViewData["TotalWeight"].ToString());
    
        double subTotal = subTotal1 + subTotal2 + subTotal3;
    
        if (subTotal >= 800)
        {
            discountRate = 20; // %
        }
        else if (subTotal >= 600)
        {
            discountRate = 15; // %
        }
        else if (subTotal >= 300)
        {
            discountRate = 10; // %
        }
        else
        {
            discountRate = 0; // %
        }
    
        if (totalWeight >= 200)
        {
            shipping = 42.50;
        }
        else if (totalWeight >= 150)
        {
            shipping = 36.25;
        }
        else if (totalWeight >= 100)
        {
            shipping = 24.48;
        }
        else if (totalWeight >= 50)
        {
            shipping = 18.65;
        }
        else
        {
            shipping = 12.25;
        }
    
        double discountAmount = subTotal * discountRate / 100;
        double orderTotal = subTotal - discountAmount + shipping;
    }
    
    <div align="center">
        <h2 style="margin-top: 6.5em">Prepare Customer Order</h2>
    
        @using (Html.BeginForm())
        {
            <table style="width: 540px;">
                <tr>
                    <td style="width: 350px; font-size: 14px; border-bottom: 2px double black; font-weight: bold; text-align: center">Item Definition</td>
                    <td style="border-bottom: 2px double black; font-size: 14px; font-weight: bold">Sale Description</td>
                </tr>
            </table>
            <table>
                <tr>
                    <td style="width: 120px"><b>Item Name</b></td>
                    <td><b>Weight</b></td>
                    <td><b>Unit Price</b></td>
                    <td><b>Quantity</b></td>
                    <td><b>Weight</b></td>
                    <td><b>Sub-Total</b></td>
                </tr>
                <tr>
                    <td>@Html.TextBox("Type1Name", @"Type1Name")</td>
                    <td>@Html.TextBox("Type1UnitWeight", @"Type1UnitWeight", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type1UnitPrice", @"Type1UnitPrice", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type1Quantity", @ViewData["Type1Quantity"], new { style = "width: 55px" })</td>
                    <td>@Html.TextBox("Type1TotalWeight", @ViewData["Type1TotalWeight"], new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type1SubTotal", @subTotal1.ToString("F"), new { style = "width: 75px" })</td>
                </tr>
                <tr>
                    <td>@Html.TextBox("Type2Name", @"Type2Name")</td>
                    <td>@Html.TextBox("Type2UnitWeight", @"Type2UnitWeight", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type2UnitPrice", @"Type2UnitPrice", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type2Quantity", @ViewData["Type2Quantity"], new { style = "width: 55px" })</td>
                    <td>@Html.TextBox("Type2TotalWeight", @ViewData["Type2TotalWeight"], new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type2SubTotal", @subTotal2.ToString("F"), new { style = "width: 75px" })</td>
                </tr>
                <tr>
                    <td>@Html.TextBox("Type3Name", @"Type3Name")</td>
                    <td>@Html.TextBox("Type3UnitWeight", @"Type3UnitWeight", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type3UnitPrice", @"Type3UnitPrice", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type3Quantity", @ViewData["Type3Quantity"], new { style = "width: 55px" })</td>
                    <td>@Html.TextBox("Type3TotalWeight", @ViewData["Type3TotalWeight"], new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type3SubTotal", @subTotal3.ToString("F"), new { style = "width: 75px" })</td>
                </tr>
            </table>
            <hr />
            <table>
                <tr>
                    <td style="width: 160px">Total Weight:</td>
                    <td>@Html.TextBox("TotalWeight", @totalWeight, new { style = "width: 75px" }) Lbs</td>
                    <td style="width: 80px">&nbsp;</td>
                    <td>Sub-Total:</td>
                    <td>@Html.TextBox("SubTotal", @subTotal.ToString("F"), new { style = "width: 75px" })</td>
                </tr>
                <tr>
                    <td>Discount Rate:</td>
                    <td>@Html.TextBox("DiscountRate", @discountRate.ToString("F"), new { style = "width: 75px" })%</td>
                    <td>&nbsp;</td>
                    <td>Discount Amount:</td>
                    <td>@Html.TextBox("DiscountAmount", @discountAmount.ToString("F"), new { style = "width: 75px" })</td>
                </tr>
                <tr>
                    <td>Shipping &amp; Handling:</td>
                    <td>@Html.TextBox("ShippingAndHandling", @shipping.ToString("F"), new { style = "width: 75px" })</td>
                    <td>&nbsp;</td>
                    <td>Order Total:</td>
                    <td>@Html.TextBox("OrderTotal", @orderTotal.ToString("F"), new { style = "width: 75px" })</td>
                </tr>
            </table>
    
            <hr />
    
            <p style="text-align: center; width: 500px">
                <input type="submit" name="btnSaveCustomerOrder"
                       value="Save Customer Order" style="width: 300px" />
            </p>
        }
    </div>
  4. Set the quantities as 6, 2, and 3

    Viewing Data in a View

  5. Click the Prepare Customer Order button:

    Introducing Interfaces

  6. Close the browser and return to your programming environment

Viewing a Bag

We already know that ViewBag is an anonymous object that can be used to send values or objects from a controller action to its related view. Besides regular values or strings, you can transfer a list (or collection) from a controller to a view using a ViewBag object. To do this, apply a property to ViewBag and assign the collection variable to it. To make it possible to send a value to a view (a webpage), the ControllerBase class (the parent of the Controller class) is equipped with a property named ViewBag:

public object ViewBag { get; }

ViewBag is an anonymous object, actually a dynamic type of object. This means that it can be anything. To start the anonymous object, in the method (the action) of a webpage in the controller class, type ViewBag, add a period to it, and add any name of a property you want. You can then assign any value to that property. Once a property of a ViewBag object holds a value, you can get that value from the view associated with that method. We have seen numerous examples of how this is done.

Introduction to List-Based Controls

Introduction to the List Box

A list box and a combo box are used to display a list of items, such as strings, in a webpage. Each item displays on its own line within the control. To create a list box or a combo box in HTML, use the SELECT tag. Inside that tag, to create each item, use an OPTION tag. Here is an example:

<!DOCTYPE html>
<html>
<head>
<title>Department Store</title>
</head>
<body>
<h2>Department Store</h2>

<form name="frmDepartmentStore" method="post">
    <p>Show items for: 
    <select name="Selection" style="width: 150px">
        <option value="0">&nbsp;</option>
        <option value="1">Men</option>
        <option value="2">Women</option>
        <option value="3">Boys</option>
        <option value="4">Girls</option>
        <option value="5">Toddlers</option>
    </select></p>
</form>
</body>
</html>

This would produce:

A List of Selected Items in a List Box or a Combo Box

To create a list box, add the MULTIPLE attribute to the SELECT tag Here is an example:

<!DOCTYPE html>
<html>
<head>
<title>Department Store</title>
</head>
<body>
<h2>Department Store</h2>

<form name="frmDepartmentStore" method="post">
    <p>Show items for:</p>
    <select name="Selection" multiple style="width: 150px">
    <option value="1">Men</option>
    <option value="2">Women</option>
    <option value="3">Boys</option>
    <option value="4">Girls</option>
    <option value="5">Toddlers</option>
</select>
</form>
</body>
</html>

This would produce:

A List of Selected Items in a List Box or a Combo Box

The Selected Item of a List Box or Combo Box

To select an item in a list box, a visitor can click the desired item. To select an item in a combo box, the user can click the down-pointing arrow of the control and select an item from the list. To support the selection of items from a list box or a combo box in ASP.NET MVC, the System.Web.Mvc namespace provides a class named SelectListItem:

public class SelectListItem

To support the text of an item, the SelectListItem class is equipped with a read-write property named Text:

public string Text { get; set; }

To support the value of an item, the SelectListItem class is equipped with a property named Value:

public string Value { get; set; }

To support the item selected in a list box or a combo box, the SelectListItem class is equipped with a property named Selected:

public string Selected { get; set; }

Selecting Items from a List Box

In a combo box, the user can select only one item. One of the options of a list box is that a user can select more than one item by clicking, holding Ctrl or Shift, and clicking the other option(s). To support the list of items of a list box in ASP.NET MVC, the System.Web.Mvc namespace provides a class named MultiSelectList. It implements the IEnumerable<> and the IEnumerable interfaces:

public class MultiSelectList : IEnumerable<SelectListItem>, IEnumerable

A Single Selection

To let you create a list-based control where only one item can be selected at a time, the System.Web.Mvc namespace provides a class named SelectList that is derived from MultiSelectList

public class SelectList : MultiSelectList

Adding Items to a List/Combo Box

Using the Members of an Enumeration

As mentioned previously (Lesson 14 on enumerations), you can use the members of an enumeration to fill a combo box or a list box. Of course, you must have or decide what enumeration to use. You can use any one of the .NET Framework built-in enumerations or you can create your own. To apply the enumeration, call the method used to create the control and use the select list argument.

Practical LearningPractical Learning: Using the Members of an Enumeration in a Combo Box

  1. In the Solution Explorer, right-click Models -> Add -> New Item...
  2. In the left frame of the Add New Item dialog box, click Code
  3. In the middle frame, click Code File
  4. Change the file Name to Basic
  5. Click Add
  6. Create an enumeration as follows:
    namespace ChairExecs4.Models
    {
        public enum Basic
        {
            Station,
            Essential,
            Instructor
        }
    }
  7. Click the StartCustomerOder.cshtml tab and change the document as follows:
    @{
        ViewBag.Title = "New Customer Order";
    }
    
    <h2>New Customer Order</h2>
    
    <div align="center">
        <h2 style="margin-top: 6.5em">New Customer Order</h2>
    
        @using (Html.BeginForm("PrepareCustomerOrder", "Business", FormMethod.Post))
        {
            <table>
                <tr>
                    <td style="width: 120px"><b>Item Name</b></td>
                    <td><b>Weight</b></td>
                    <td><b>Unit Price</b></td>
                    <td><b>Quantity</b></td>
                </tr>
                <tr>
                    <td>@Html.DropDownList("Type1Name",
                                           new SelectList(Enum.GetValues(typeof(ChairExecs4.Models.Basic))),
                                           new { style = "width: 160px" })</td>
                    <td>@Html.TextBox("Type1UnitWeight", "16", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type1UnitPrice", "64.95", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type1Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
                <tr>
                    <td>@Html.TextBox("Type2Name", "Scholar")</td>
                    <td>@Html.TextBox("Type2UnitWeight", "32", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type2UnitPrice", "104.45", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type2Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
                <tr>
                    <td>@Html.TextBox("Type3Name", "Executive")</td>
                    <td>@Html.TextBox("Type3UnitWeight", "36", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type3UnitPrice", "154.55", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type3Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
            </table>
    
            <hr />
    
            <p style="text-align: center; width: 500px">
                <input type="submit" name="btnPrepareCustomerOrder"
                       value="Prepare Customer Order" style="width: 300px" />
            </p>
        }
    </div>
  8. Click the StartCustomerOrder.cshtml tab to access it
  9. To execute the project, on the main menu, click Debug ->Start Without Debugging:

    Viewing Data in a View

    Viewing Data in a View

  10. Close the form and return to your programming environment

Introduction to Using an Enumerable List

Remember that the MultiSelectList class implements both the IEnumerable<> and the IEnumerable interfaces. This means you can create a list using a class that implements those interfaces and use the items of that list for the list box or combo box.

Practical LearningPractical Learning: Applying an Enumerable List to a Combo Box

  1. Change the document as follows:
    @{
        ViewBag.Title = "New Customer Order";
    }
    
    <h2>New Customer Order</h2>
    
    <div align="center">
        <h2 style="margin-top: 6.5em">New Customer Order</h2>
    
        @using (Html.BeginForm("PrepareCustomerOrder", "Business", FormMethod.Post))
        {
            var Type2Name = new List<SelectListItem>();
    
            Type2Name.Add(new SelectListItem { Value = "Scholar", Text = "Scholar" });
            Type2Name.Add(new SelectListItem { Value = "Conviction", Text = "Conviction" });
    
            <table>
                <tr>
                    <td style="width: 120px"><b>Item Name</b></td>
                    <td><b>Weight</b></td>
                    <td><b>Unit Price</b></td>
                    <td><b>Quantity</b></td>
                </tr>
                <tr>
                    <td>@Html.DropDownList("Type1Name",
                                           new SelectList(Enum.GetValues(typeof(ChairExecs4.Models.Basic))),
                                           new { style = "width: 160px" })</td>
                    <td>@Html.TextBox("Type1UnitWeight", "16", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type1UnitPrice", "64.95", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type1Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
                <tr>
                    <td>@Html.DropDownList("Type2Name", Type2Name, new { style = "width: 160px" })</td>
                    <td>@Html.TextBox("Type2UnitWeight", "32", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type2UnitPrice", "104.45", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type2Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
                <tr>
                    <td>@Html.TextBox("Type3Name", "Executive")</td>
                    <td>@Html.TextBox("Type3UnitWeight", "36", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type3UnitPrice", "154.55", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type3Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
            </table>
    
            <hr />
    
            <p style="text-align: center; width: 500px">
                <input type="submit" name="btnPrepareCustomerOrder"
                       value="Prepare Customer Order" style="width: 300px" />
            </p>
        }
    </div>
  2. To preview the result, press Ctrl + F5

    Viewing Data in a View

    Viewing Data in a View

  3. Close the browser and return to your programming environment

Using a View Bag

When creating the action method of a form, you can created a list of items (usually a list of strings) that you want to use in a list box or a combo box. After creating the list, assign it to a ViewData indexer. Pass the name of the control (or the name you will use for the control). In the form, simply use the same name for the control.

Practical LearningPractical Learning: Using a View Bag for a Combo Box

  1. Click the BusinessController.cs tab to activate it
  2. Change the StartCustomerOrder() method as follows:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace ChairExecs4.Controllers
    {
        public class BusinessController : Controller
        {
            // GET: Business
            public ActionResult Index()
            {
                return View();
            }
    
            // GET: Business/StartCustomerOrder
            public ActionResult StartCustomerOrder()
            {
                List<SelectListItem> execs = new List<SelectListItem>();
    
                execs.Add(new SelectListItem() { Text = "Excellent", Value = "1" });
                execs.Add(new SelectListItem() { Text = "Executive", Value = "2" });
    
                ViewData["Type3Name"] = execs;
    
                return View();
            }
    
            public ActionResult PrepareCustomerOrder(string Type1Name, string Type1UnitWeight, string Type1UnitPrice, string Type1Quantity,
                                                     string Type2Name, string Type2UnitWeight, string Type2UnitPrice, string Type2Quantity,
                                                     string Type3Name, string Type3UnitWeight, string Type3UnitPrice, string Type3Quantity)
            {
                int iType1Weight = int.Parse(Request["Type1UnitWeight"]);
                int iType1Quantity = int.Parse(Request["Type1Quantity"]);
                double dType1UnitPrice = double.Parse(Request["Type1UnitPrice"]);
    
                int iType2Weight = int.Parse(Request["Type2UnitWeight"]);
                int iType2Quantity = int.Parse(Request["Type2Quantity"]);
                double dType2UnitPrice = double.Parse(Request["Type2UnitPrice"]);
    
                int iType3Weight = int.Parse(Request["Type3UnitWeight"]);
                int iType3Quantity = int.Parse(Request["Type3Quantity"]);
                double dType3UnitPrice = double.Parse(Request["Type3UnitPrice"]);
    
                int type1TotalWeight = 0, type2TotalWeight = 0, type3TotalWeight = 0;
    
                if (iType1Quantity == 0)
                    type1TotalWeight = 0;
                else
                    type1TotalWeight = iType1Weight * iType1Quantity;
    
                if (iType2Quantity == 0)
                    type2TotalWeight = 0;
                else
                    type2TotalWeight = iType2Weight * iType2Quantity;
    
                if (iType3Quantity == 0)
                    type3TotalWeight = 0;
                else
                    type3TotalWeight = iType3Weight * iType3Quantity;
    
                ViewData["Type1Quantity"] = Type1Quantity;
                ViewData["Type2Quantity"] = Type2Quantity;
                ViewData["Type3Quantity"] = Type3Quantity;
                ViewData["Type1SubTotal"] = dType1UnitPrice * iType1Quantity;
                ViewData["Type2SubTotal"] = dType2UnitPrice * iType2Quantity;
                ViewData["Type3SubTotal"] = dType3UnitPrice * iType3Quantity;
                ViewData["Type1TotalWeight"] = type1TotalWeight;
                ViewData["Type2TotalWeight"] = type2TotalWeight;
                ViewData["Type3TotalWeight"] = type3TotalWeight;
                ViewData["TotalWeight"] = iType1Weight + iType2Weight + iType3Weight;
    
                return View();
            }
        }
    }
  3. Click the StartCustomerOrder.cshtml tab to activate it
  4. Change the document as follows:
    @{
        ViewBag.Title = "New Customer Order";
    }
    
    <h2>New Customer Order</h2>
    
    <div align="center">
        <h2 style="margin-top: 6.5em">New Customer Order</h2>
    
        @using (Html.BeginForm("PrepareCustomerOrder", "Business", FormMethod.Post))
        {
            var Type2Name = new List<SelectListItem>();
    
            Type2Name.Add(new SelectListItem { Value = "Scholar", Text = "Demeanor" });
            Type2Name.Add(new SelectListItem { Value = "Conviction", Text = "Fans Seat" });
    
            <table>
                <tr>
                    <td style="width: 120px"><b>Item Name</b></td>
                    <td><b>Weight</b></td>
                    <td><b>Unit Price</b></td>
                    <td><b>Quantity</b></td>
                </tr>
                <tr>
                    <td>@Html.DropDownList("Type1Name",
                                           new SelectList(Enum.GetValues(typeof(ChairExecs4.Models.Basic))),
                                           new { style = "width: 160px" })</td>
                    <td>@Html.TextBox("Type1UnitWeight", "16", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type1UnitPrice", "64.95", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type1Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
                <tr>
                    <td>@Html.DropDownList("Type2Name", Type2Name, new { style = "width: 160px" })</td>
                    <td>@Html.TextBox("Type2UnitWeight", "32", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type2UnitPrice", "104.45", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type2Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
                <tr>
                    <td>
                        @Html.DropDownList("Type3Name", null, new { style = "width: 160px" })</td>
                    <td>@Html.TextBox("Type3UnitWeight", "36", new { style = "width: 55px" }) Lbs</td>
                    <td>@Html.TextBox("Type3UnitPrice", "154.55", new { style = "width: 75px" })</td>
                    <td>@Html.TextBox("Type3Quantity", "0", new { style = "width: 55px" })</td>
                </tr>
            </table>
    
            <hr />
    
            <p style="text-align: center; width: 500px">
                <input type="submit" name="btnPrepareCustomerOrder"
                       value="Prepare Customer Order" style="width: 300px" /></p>
        }
    </div>
  5. To execute the project, on the main menu, click Debug ->Start Without Debugging:

    Viewing Data in a View

    Viewing Data in a View

  6. Close the form and return to your programming environment
  7. Close your programming environment

Previous Copyright © 2010-2019, FunctionX Next