Zugreifen auf Modelldaten anhand eines ControllersAccessing Your Model's Data from a Controller

von Rick Andersonby Rick Anderson

Note

Eine aktualisierte Version dieses Tutorials finden Sie hier unter Verwendung der neuesten Version von Visual Studio.An updated version of this tutorial is available here using the latest version of Visual Studio. Das neue Tutorial verwendet ASP.net Core MVC, das in diesem Tutorial viele Verbesserungen bietet.The new tutorial uses ASP.NET Core MVC, which provides many improvements over this tutorial.

Dieses Tutorial vermittelt Informationen zu ASP.NET Core MVC mit Controllern und Ansichten.This tutorial teaches ASP.NET Core MVC with controllers and views. Razor Pages sind eine neue Alternative in ASP.NET Core 2.0: Ein seitenbasiertes Programmiermodell, mit dem das Erstellen einer Webbenutzeroberfläche einfacher und produktiver wird.Razor Pages is a new alternative in ASP.NET Core 2.0, a page-based programming model that makes building web UI easier and more productive. Es empfiehlt sich, dass Sie sich das Tutorial der Razor Pages vor der MVC-Version ansehen.We recommend you try the Razor Pages tutorial before the MVC version. Das Tutorial zu Razor Pages:The Razor Pages tutorial:

  • Ist einfacher zu befolgen.Is easier to follow.
  • Behandelt mehr Features.Covers more features.
  • Ist die bevorzugte Methode für die Entwicklung neuer Anwendungen.Is the preferred approach for new application development.

In diesem Abschnitt erstellen Sie eine neue MoviesController Klasse und schreiben Code, mit dem die Filmdaten abgerufen und im Browser mithilfe einer Ansichts Vorlage angezeigt werden.In this section, you'll create a new MoviesController class and write code that retrieves the movie data and displays it in the browser using a view template.

Erstellen Sie die Anwendung , und fahren Sie mit dem nächsten Schritt fort.Build the application before going on to the next step. Wenn Sie die Anwendung nicht erstellen, erhalten Sie einen Fehler beim Hinzufügen eines Controllers.If you don't build the application, you'll get an error adding a controller.

Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Controller , und klicken Sie dann auf Hinzufügenund dann auf ControllerIn Solution Explorer, right-click the Controllers folder and then click Add, then Controller.

Klicken Sie im Dialogfeld Gerüst hinzufügen auf MVC 5-Controller mit Ansichten, verwenden Sie Entity Framework, und klicken Sie dann auf Hinzufügen.In the Add Scaffold dialog box, click MVC 5 Controller with views, using Entity Framework, and then click Add.

  • Wählen Sie Movie (mvcmovie. Models) für die Modell Klasse aus.Select Movie (MvcMovie.Models) for the Model class.

  • Wählen Sie für die Datenkontext Klasse die Option " wviedbcontext (mvcmovie. Models) " aus.Select MovieDBContext (MvcMovie.Models) for the Data context class.

  • Geben Sie für den Controller Namen den Namen moviescontrollerein.For the Controller name enter MoviesController.

    In der folgenden Abbildung wird das Dialogfeld abgeschlossen angezeigt.The image below shows the completed dialog.

Klicken Sie auf Hinzufügen.Click Add. (Wenn Sie eine Fehlermeldung erhalten, haben Sie die Anwendung wahrscheinlich nicht erstellt, bevor Sie mit dem Hinzufügen des Controllers begonnen haben.) Visual Studio erstellt die folgenden Dateien und Ordner:(If you get an error, you probably didn't build the application before starting adding the controller.) Visual Studio creates the following files and folders:

  • Eine MoviesController.cs -Datei im Controller Ordner.A MoviesController.cs file in the Controllers folder.
  • Ein Ordner " views\movies ".A Views\Movies folder.
  • " Create. cshtml", "Delete. cshtml", "Details. cshtml", "Edit. cshtml" und " Index. cshtml " im neuen Ordner " views\movies ".Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtml, and Index.cshtml in the new Views\Movies folder.

Visual Studio erstellte automatisch die CRUD -Aktionsmethoden und-Sichten (Create, Read, Update und DELETE) für Sie (die automatische Erstellung von CRUD-Aktionsmethoden und-Sichten wird als Gerüstbau bezeichnet).Visual Studio automatically created the CRUD (create, read, update, and delete) action methods and views for you (the automatic creation of CRUD action methods and views is known as scaffolding). Sie verfügen jetzt über eine voll funktionsfähige Webanwendung, mit der Sie Film Einträge erstellen, auflisten, bearbeiten und löschen können.You now have a fully functional web application that lets you create, list, edit, and delete movie entries.

Führen Sie die Anwendung aus, und klicken Sie auf den Link MVC Movie (oder navigieren Sie zu dem Movies Controller, indem Sie /Movies an die URL in der Adressleiste Ihres Browsers Anhängen).Run the application and click on the MVC Movie link (or browse to the Movies controller by appending /Movies to the URL in the address bar of your browser). Da sich die Anwendung auf das Standard Routing bezieht (definiert in der App _ start\routeconfig.cs -Datei), wird die Browser Anforderung http://localhost:xxxxx/Movies an die Standard Index Aktionsmethode des Controllers weitergeleitet Movies .Because the application is relying on the default routing (defined in the App_Start\RouteConfig.cs file), the browser request http://localhost:xxxxx/Movies is routed to the default Index action method of the Movies controller. Anders ausgedrückt: die Browser Anforderung http://localhost:xxxxx/Movies ist praktisch identisch mit der Browser Anforderung http://localhost:xxxxx/Movies/Index .In other words, the browser request http://localhost:xxxxx/Movies is effectively the same as the browser request http://localhost:xxxxx/Movies/Index. Das Ergebnis ist eine leere Liste von Filmen, da Sie noch keine hinzugefügt haben.The result is an empty list of movies, because you haven't added any yet.

Erstellen eines FilmsCreating a Movie

Klicken Sie auf den Link Neu erstellen.Select the Create New link. Geben Sie einige Details zu einem Film ein, und klicken Sie dann auf die Schaltfläche Erstellen .Enter some details about a movie and then click the Create button.

Note

Sie können möglicherweise keine Dezimaltrennzeichen oder Kommas in das Feld Price eingeben.You may not be able to enter decimal points or commas in the Price field. Um die jQuery-Validierung für nicht englische Gebiets Schemas zu unterstützen, die ein Komma ( " , " ) für einen Dezimaltrennzeichen und nicht-US-englische Datumsformate verwenden, müssen Sie globalize.js und ihre spezifischen Kulturen/globalize.cultures.js Datei (von https://github.com/jquery/globalize ) und JavaScript einschließen, um zu verwenden Globalize.parseFloat .To support jQuery validation for non-English locales that use a comma (",") for a decimal point, and non US-English date formats, you must include globalize.js and your specific cultures/globalize.cultures.js file(from https://github.com/jquery/globalize ) and JavaScript to use Globalize.parseFloat. Im nächsten Tutorial zeige ich Ihnen, wie dies geschieht.I'll show how to do this in the next tutorial. Geben Sie einstweilen ganze Zahlen wie 10 ein.For now, just enter whole numbers like 10.

Wenn Sie auf die Schaltfläche Erstellen klicken, wird das Formular an den Server gesendet, auf dem die Filminformationen in der Datenbank gespeichert werden.Clicking the Create button causes the form to be posted to the server, where the movie information is saved in the database. Sie werden dann zur URL /Movies umgeleitet, auf der Sie den neu erstellten Film in der Auflistung sehen können.You're then redirected to the /Movies URL, where you can see the newly created movie in the listing.

Erstellen Sie ein paar weitere Filmeinträge.Create a couple more movie entries. Testen Sie die Links Edit (Bearbeiten), Details und Delete (Löschen), die alle funktionsbereit sind.Try the Edit, Details, and Delete links, which are all functional.

Untersuchen des generierten CodesExamining the Generated Code

Öffnen Sie die Datei " controllers\moviescontroller.cs ", und überprüfen Sie die generierte Index Methode.Open the Controllers\MoviesController.cs file and examine the generated Index method. Ein Teil des Movie-Controllers mit der- Index Methode wird unten dargestellt.A portion of the movie controller with the Index method is shown below.

public class MoviesController : Controller
{
    private MovieDBContext db = new MovieDBContext();

    // GET: /Movies/
    public ActionResult Index()
    {
        return View(db.Movies.ToList());
    }

Eine Anforderung an den Movies Controller gibt alle Einträge in der Movies Tabelle zurück und übergibt dann die Ergebnisse an die Index Ansicht.A request to the Movies controller returns all the entries in the Movies table and then passes the results to the Index view. Die folgende Zeile der- MoviesController Klasse instanziiert einen Film Daten Bank Kontext, wie zuvor beschrieben.The following line from the MoviesController class instantiates a movie database context, as described previously. Sie können den Film Daten Bank Kontext verwenden, um Filme abzufragen, zu bearbeiten und zu löschen.You can use the movie database context to query, edit, and delete movies.

private MovieDBContext db = new MovieDBContext();

Stark typisierte Modelle und das @model SchlüsselwortStrongly Typed Models and the @model Keyword

An früherer Stelle in diesem Tutorial haben Sie erfahren, wie ein Controllerdaten oder Objekte mithilfe des-Objekts an eine Ansichts Vorlage übergeben kann ViewBag .Earlier in this tutorial, you saw how a controller can pass data or objects to a view template using the ViewBag object. ViewBagIst ein dynamisches Objekt, das eine bequeme spät gebundene Methode zum Übergeben von Informationen an eine Ansicht bereitstellt.The ViewBag is a dynamic object that provides a convenient late-bound way to pass information to a view.

MVC bietet auch die Möglichkeit, stark typisierte Objekte an eine Ansichts Vorlage zu übergeben.MVC also provides the ability to pass strongly typed objects to a view template. Dieser stark typisierte Ansatz ermöglicht eine bessere Kompilierzeit Überprüfung Ihres Codes und umfangreicheres IntelliSense im Visual Studio-Editor.This strongly typed approach enables better compile-time checking of your code and richer IntelliSense in the Visual Studio editor. Der Gerüstbau Mechanismus in Visual Studio verwendet diesen Ansatz (d. h. die Übergabe eines stark typisierten Modells) mit den MoviesController Klassen-und Ansichts Vorlagen, als die Methoden und Sichten erstellt wurden.The scaffolding mechanism in Visual Studio used this approach (that is, passing a strongly typed model) with the MoviesController class and view templates when it created the methods and views.

Untersuchen Sie in der Datei " controllers\moviescontroller.cs " die generierte Details Methode.In the Controllers\MoviesController.cs file examine the generated Details method. Die- Details Methode wird unten dargestellt.The Details method is shown below.

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Der- id Parameter wird im Allgemeinen als Routendaten übergeben, z http://localhost:1234/movies/details/1 . b. wird der Controller auf den Movie-Controller, die-Aktion auf details und id auf 1 festgelegt.The id parameter is generally passed as route data, for example http://localhost:1234/movies/details/1 will set the controller to the movie controller, the action to details and the id to 1. Außerdem können Sie die ID wie folgt mit einer Abfrage Zeichenfolge übergeben:You could also pass in the id with a query string as follows:

http://localhost:1234/movies/details?id=1

Wenn eine- Movie Instanz gefunden wird, wird eine Instanz des Movie Modells an die Details Ansicht übermittelt:If a Movie is found, an instance of the Movie model is passed to the Details view:

return View(movie);

Überprüfen Sie den Inhalt der Datei " views\movies\details.cshtml ":Examine the contents of the Views\Movies\Details.cshtml file:

@model MvcMovie.Models.Movie

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>Movie</h4>
<hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>
         @*Markup omitted for clarity.*@        
    </dl>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

Durch Einschließen einer- @model Anweisung am Anfang der Ansichts Vorlagen Datei können Sie den Objekttyp angeben, den die Sicht erwartet.By including a @model statement at the top of the view template file, you can specify the type of object that the view expects. Beim Erstellen des „Movies“-Controllers hat Visual Studio automatisch die folgende @model-Anweisung am Anfang der Datei Details.cshtml hinzugefügt:When you created the movie controller, Visual Studio automatically included the following @model statement at the top of the Details.cshtml file:

@model MvcMovie.Models.Movie

Diese @model-Direktive ermöglicht Ihnen den Zugriff auf den Film, den der Controller an die Ansicht übergeben hat, indem ein stark typisiertes Model-Objekt verwendet wir.This @model directive allows you to access the movie that the controller passed to the view by using a Model object that's strongly typed. Beispielsweise übergibt der Code in der Vorlage Details. cshtml jedes Movie-Feld an die DisplayNameFor HTML-Hilfsprogramme und Display for mit dem stark typisierten- Model Objekt.For example, in the Details.cshtml template, the code passes each movie field to the DisplayNameFor and DisplayFor HTML Helpers with the strongly typed Model object. Die Create -und- Edit Methoden und-Ansichts Vorlagen übergeben auch ein Movie Model-Objekt.The Create and Edit methods and view templates also pass a movie model object.

Überprüfen Sie die Ansichts Vorlage Index. cshtml und die- Index Methode in der Datei MoviesController.cs .Examine the Index.cshtml view template and the Index method in the MoviesController.cs file. Beachten Sie, wie der Code ein-Objekt erstellt, List Wenn es die- View Hilfsmethode in der- Index Aktionsmethode aufruft.Notice how the code creates a List object when it calls the View helper method in the Index action method. Der Code übergibt dann diese Movies Liste von der Index Aktionsmethode an die Ansicht:The code then passes this Movies list from the Index action method to the view:

public ActionResult Index()
{
    return View(db.Movies.ToList());
}

Beim Erstellen des Film Controllers enthielt Visual Studio automatisch die folgende @model Anweisung am Anfang der Datei " Index. cshtml ":When you created the movie controller, Visual Studio automatically included the following @model statement at the top of the Index.cshtml file:

@model IEnumerable<MvcMovie.Models.Movie>

Diese @model Direktive ermöglicht Ihnen den Zugriff auf die Liste der Filme, die der Controller an die Ansicht übermittelt hat, indem Model er ein stark typisiertes-Objekt verwendet.This @model directive allows you to access the list of movies that the controller passed to the view by using a Model object that's strongly typed. In der Vorlage Index. cshtml durchläuft der Code z. b. die Filme durch Ausführen einer- foreach Anweisung über das stark typisierte- Model Objekt:For example, in the Index.cshtml template, the code loops through the movies by doing a foreach statement over the strongly typed Model object:

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
         <th>
            @Html.DisplayFor(modelItem => item.Rating)
        </th>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID })  |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID }) 
        </td>
    </tr>
}

Da das- Model Objekt stark typisiert ist (als- IEnumerable<Movie> Objekt), item wird jedes Objekt in der Schleife als typisiert Movie .Because the Model object is strongly typed (as an IEnumerable<Movie> object), each item object in the loop is typed as Movie. Dies bedeutet neben anderen Vorteilen, dass Sie die Kompilierzeit Überprüfung des Codes und die vollständige IntelliSense-Unterstützung im Code-Editor erhalten:Among other benefits, this means that you get compile-time checking of the code and full IntelliSense support in the code editor:

Modelintellisense

Arbeiten mit SQL Server LocalDBWorking with SQL Server LocalDB

Entity Framework Code First festgestellt, dass die angegebene Daten bankverbindungs Zeichenfolge auf eine Datenbank verweist, die Movies noch nicht vorhanden war, sodass Code First die Datenbank automatisch erstellt hat.Entity Framework Code First detected that the database connection string that was provided pointed to a Movies database that didn't exist yet, so Code First created the database automatically. Sie können überprüfen, ob er erstellt wurde, indem Sie im Ordner App- _ Daten suchen.You can verify that it's been created by looking in the App_Data folder. Wenn die Datei Movies. mdf nicht angezeigt wird, klicken Sie auf der Projektmappen-Explorer Symbolleiste auf die Schaltfläche alle Dateien anzeigen , klicken Sie auf die Schaltfläche Aktualisieren , und erweitern Sie dann den Ordner App- _ Daten .If you don't see the Movies.mdf file, click the Show All Files button in the Solution Explorer toolbar, click the Refresh button, and then expand the App_Data folder.

Doppelklicken Sie auf Movies. mdf , um den Server-Explorerzu öffnen, und erweitern Sie dann den Ordner Tabellen , um die Tabelle Movies anzuzeigen.Double-click Movies.mdf to open SERVER EXPLORER, then expand the Tables folder to see the Movies table. Beachten Sie das Schlüsselsymbol neben ID.Note the key icon next to ID. Standardmäßig wird von EF eine Eigenschaft mit dem Namen ID als Primärschlüssel erstellt.By default, EF will make a property named ID the primary key. Weitere Informationen zu EF und MVC finden Sie im hervorragenden Tutorial zu Tom Dykstra in MVC und EF.For more information on EF and MVC, see Tom Dykstra's excellent tutorial on MVC and EF.

DB_explorerDB_explorer

Klicken Sie mit der rechten Maustaste auf die Movies Tabelle, und wählen Sie Tabellendaten anzeigen aus, um die erstellten Daten anzuzeigen.Right-click the Movies table and select Show Table Data to see the data you created.

Klicken Sie mit der rechten Maustaste auf die Movies Tabelle, und wählen Sie Tabellen Definition öffnen , um die Tabellenstruktur anzuzeigen, die Entity Framework für Sie erstellt Code First.Right-click the Movies table and select Open Table Definition to see the table structure that Entity Framework Code First created for you.

Beachten Sie, dass das Schema der Movies Tabelle der-Klasse zugeordnet ist, die Movie Sie zuvor erstellt haben.Notice how the schema of the Movies table maps to the Movie class you created earlier. Entity Framework Code First dieses Schema basierend auf Ihrer Klasse automatisch für Sie erstellt Movie .Entity Framework Code First automatically created this schema for you based on your Movie class.

Wenn Sie fertig sind, schließen Sie die Verbindung, indem Sie mit der rechten Maustaste auf " muviedbcontext " klicken und Verbindung schließenauswählenWhen you're finished, close the connection by right clicking MovieDBContext and selecting Close Connection. (Wenn Sie die Verbindung nicht schließen, erhalten Sie möglicherweise eine Fehlermeldung, wenn Sie das Projekt das nächste Mal ausführen).(If you don't close the connection, you might get an error the next time you run the project).

Sie verfügen jetzt über eine Datenbank und Seiten zum Anzeigen, Bearbeiten, Aktualisieren und Löschen von Dateien.You now have a database and pages to display, edit, update and delete data. Im nächsten Tutorial untersuchen wir den restlichen Code und fügen eine SearchIndex Methode und eine SearchIndex Ansicht hinzu, mit der Sie in dieser Datenbank nach Filmen suchen können.In the next tutorial, we'll examine the rest of the scaffolded code and add a SearchIndex method and a SearchIndex view that lets you search for movies in this database. Weitere Informationen zur Verwendung von Entity Framework mit MVC finden Sie unter Erstellen eines Entity Framework Datenmodells für eine ASP.NET MVC-Anwendung.For more information on using Entity Framework with MVC, see Creating an Entity Framework Data Model for an ASP.NET MVC Application.