Create the View (UI)

by Mike Wasson

Download Completed Project

In this section, you will start to define the HTML for the app, and add data binding between the HTML and the view model.

Open the file Views/Home/Index.cshtml. Replace the entire contents of that file with the following.

@section scripts {

<div class="page-header">

<div class="row">

  <div class="col-md-4">
    <div class="panel panel-default">
      <div class="panel-heading">
        <h2 class="panel-title">Books</h2>
      <div class="panel-body">
        <ul class="list-unstyled" data-bind="foreach: books">
            <strong><span data-bind="text: AuthorName"></span></strong>: <span data-bind="text: Title"></span>
            <small><a href="#">Details</a></small>
    <div class="alert alert-danger" data-bind="visible: error"><p data-bind="text: error"></p></div>

  <div class="col-md-4">
    <!-- TODO: Book details -->

  <div class="col-md-4">
    <!-- TODO: Add new book -->

Most of the div elements are there for Bootstrap styling. The important elements are the ones with data-bind attributes. This attribute links the HTML to the view model.

For example:

<p data-bind="text: error">

In this example, the "text" binding causes the <p> element to show the value of the error property from the view model. Recall that error was declared as a ko.observable:

self.error = ko.observable();

Whenever a new value is assigned to error, Knockout updates the text in the <p> element.

The foreach binding tells Knockout to loop through the contents of the books array. For each item in the array, Knockout creates a new <li> element. Bindings inside the context of the foreach refer to properties on the array item. For example:

<span data-bind="text: Author"></span>

Here the text binding reads the Author property of each book.

If you run the application now, it should look like this:

The list of books loads asynchronously, after the page loads. Right now, the "Details" links are not functional. We'll add this functionality in the next section.