Bauen der Web-App
Kurzüberblick 05
Angepasste Controller
Sushi für's Hirn
ICM@I3CM
Inverted Classroom Model im Institut für Ingenieurinformatik und computergestützte Mathematik (I3CM)
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basisfunktionen
Neben den Objektfunktionen (s. letzter Foliensatz) müssen auch noch Anwendungsfunktionen erstellt werden (s. nächster Foliensatz).
Bevor wir damit beginnen sollen in diesem Foliensatz einige Basisfunktionen, die zum Betrieb der Anwendung notwendig sind, implementiert werden. Diese dienen gleichzeitig als Beispiel für einen angepassten Controller-View-Satz, der auf Basis eines Objekttyps erstellt wird und einen Controller, der Funktionen unabhängig vom Datenmodell bereitstellt.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Übersicht
Pseudologin
Datensetup
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Zielsetzung
Bei vielen Anwendungen sind Funktionen und Sichten vom eingeloggten Anwender abhängig. So werden, z.B. bei der Bibliothek für jeden Anwender Daten wie Namen, Vorname und Adresse gespeichert und als Funktionalität die Bücher angezeigt, die ich ausgeliehen habe. In der Regel ist der Benutzer als Entität im Datenmodell vorgesehen. Es bietet sich in der Praxis an die Funktion des Logins, die der WebServer mittels HTTP ohnehin bereitstellt mit dieser Entität zu verknüpfen.
Darüber hinaus lassen sich in MVC.NET auch Rechte an den einzelnen Funktionen der Controller durch sog. Annotationen bestimmten Rollen gewähren oder verweigern. Diese sind aber in der Regel zu grob, weil z.B. eine Freigabe-Funktion nicht global für eine Rolle freigegeben wird, sondern nur innerhalb eine bestimmten Kontextes (z.B. einem Bauteil).
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Zielsetzung
In unsere Anwendung beschränken wir uns zunächst darauf aus der Liste der möglichen User denjenigen auszuwählen, der eingeloggt ist.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Rollen
Zur Realisierung von Rollen sollten keine SubTypes der User-Klasse erstellt werden, es bietet sich an die bestehende User-Klasse so zu gestalten, dass alles Informationen darin enthalten sind oder verknüpft werden können. So können die User später verschiedene Rollen einnehmen.
Globale Rollen, die Systemweit gelten (z.B. Administrator) können als einfache Flags vom Typ boolean an der User-Klasse modelliert werden.
Kontextbezogene Rollen (z.B. Projektleiter) müssen als Relationen modelliert werden, weil der User diese Rolle ja nur gegenüber einem anderen Objekt einnimmt und nicht global.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Rollen
In der Bibliothek gibt es folgende globale Rollen:
Der Kunde (RoleCostumer) soll Werk bestellen und Bestellungen stornieren können und Medien ausleihen und zurückgeben können.
Der Administrator (RoleAdministrator) soll Benutzerkonten löschen und ändern sowie Medien und Werke anlegen, löschen und ändern dürfen.
Der Angestellte (RoleStaff) darf Werke für Anwender bestellen, Bestellungen stornieren sowie Ausleih- und Rückgabevorgänge verbuchen.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Zusätzlicher Controller
Zusätzliche Funktionen (Sichten, Actions, etc.) können über zusätzliche Controller eingebaut werden. Grundsätzlich kann man diese komplett selber schreiben.
Es empfiehlt sich aber mit einem automatisch generierten Satz von Controller und Views zu beginnen und diese Anzupassen.
Für zusätzliche Funktionen kann man auch noch zusätzliche View erzeugen.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Zusätzlicher Controller
Für unserer Beispiel soll zunächst eine Funktion erstellt werden, mit der man einen eingeloggten User auswählen kann.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Zusätzlicher Controller
Für unserer Beispiel soll zunächst eine Funktion erstellt werden, mit der man einen eingeloggten User auswählen kann.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Zusätzlicher Controller
Für unserer Beispiel soll zunächst eine Funktion erstellt werden, mit der man einen eingeloggten User auswählen kann.
Es bietet sich daher an, einen automatisch generierten Satz von Controller und View auf Basis des Modelltypes User zu erstellen und entsprechend anzupassen.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Zusätzlicher Controller
Für unserer Beispiel soll zunächst eine Funktion erstellt werden, mit der man einen eingeloggten User auswählen kann.
Es bietet sich daher an, einen automatisch generierten Satz von Controller und View auf Basis des Modelltypes User zu erstellen und entsprechend anzupassen.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Zusätzlicher Controller
Für unserer Beispiel soll zunächst eine Funktion erstellt werden, mit der man einen eingeloggten User auswählen kann.
Es bietet sich daher an, einen automatisch generierten Satz von Controller und View auf Basis des Modelltypes User zu erstellen und entsprechend anzupassen.
Dieser Controller wird als LoginController benannt.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Zusätzlicher Controller
Wie gehabt basiert der Controller auf einer Klasse (im Beispiel User).
Es wird aber ein anderer Name vergeben. Im Beispiel wird zunächst ein Controller für die kundenspezifische Ansicht der Userdaten erzeugt.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
LoginController
Dann werden aus dem Controller alle Methoden außer Index() und Details() gelöscht.
Außerdem werden alles Views außer Index gelöscht, den Index bietet eine Funktion zum auflisten aller User, ist also ideal als Basis für eine Auswahl aus allen Usern geeignet.
Die Methode Details() bietet die Möglichkeit einen User-Datensatz anzuzeigen, wie nutzen dieses Vorlage um einen User auszuwählen.
public class LoginController : Controller
{
private BibliothekModelContainer db =
new BibliothekModelContainer();
// GET: Login
public ActionResult Index()
{
return View(db.Users.ToList());
}
// GET: Login/Details/5
public ActionResult Select(int? id)
{
if (id == null)
{
return new
HttpStatusCodeResult(
HttpStatusCode.BadRequest);
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
return RedirectToAction("Index");
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
LoginController
Die Methode Details() bietet die Möglichkeit einen User-Datensatz anzuzeigen, wie nutzen dieses Vorlage um einen User auszuwählen.
Zur Auwahl wird im View Login/Index der ActionLink für Details so angepasst, dass die Select()-Methode ausgeführt wird.
public class LoginController : Controller
{
private BibliothekModelContainer db =
new BibliothekModelContainer();
// GET: Login
public ActionResult Index()
{
return View(db.Users.ToList());
}
// GET: Login/Details/5
public ActionResult Select(int? id)
{
if (id == null)
{
return new
HttpStatusCodeResult(
HttpStatusCode.BadRequest);
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
return RedirectToAction("Index");
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
LoginController
Die Methode Details() bietet die Möglichkeit einen User-Datensatz anzuzeigen, wie nutzen dieses Vorlage um einen User auszuwählen.
<td>
@Html.ActionLink(
"Select", "Select", new { id=item.Id })
</td>
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
LoginController
Die Methode Details() bietet die Möglichkeit einen User-Datensatz anzuzeigen, wie nutzen dieses Vorlage um einen User auszuwählen.
Zur Auswahl wird im View Login/Index der ActionLink für Details so angepasst, dass die Select()-Methode ausgeführt wird.
<td>
@Html.ActionLink(
"Select", "Select", new { id=item.Id })
</td>
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
LoginController
Abschließend wird im View _Shared/Layout noch ein ActionLink eingefügt mit dem der Anwender auf die Seite zur Auswahl der Anwender gelangt.
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink(
"Contact", "Contact", "Home")</li>
<li>@Html.ActionLink("Login", "Index", "Login")</li>
</ul>
</div>
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Da in der gesamten Anwendung Zugriff auf den eingeloggten User möglich sein soll, verlagern wir die entsprechende Funktion in einen Basis-Controller, von dem dann alle anderen Controller abgeleitet werden.
public class BaseController : Controller
{
protected BibliothekModelContainer db =
new BibliothekModelContainer();
private static String UserIdKey = "UserId";
public User setUser()
{
...
}
private User _LoggedInUser = null;
protected User LoggedInUser => _LoggedInUser?? setUser();
protected bool hasUser()
{
return LoggedInUser != null;
}
protected void setUserId(int userId)
{
Session[UserIdKey] = userId;
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Da in der gesamten Anwendung Zugriff auf den eingeloggten User möglich sein soll, verlagern wir die entsprechende Funktion in einen Basis-Controller, von dem dann alle anderen Controller abgeleitet werden.
Die Klasse BaseController ist von Controller abgeleitet, so dass weiterhin alle abgeleiteten Controller auch von diesem Typ sind.
public class BaseController : Controller
{
protected BibliothekModelContainer db =
new BibliothekModelContainer();
private static String UserIdKey = "UserId";
public User setUser()
{
...
}
private User _LoggedInUser = null;
protected User LoggedInUser => _LoggedInUser?? setUser();
protected bool hasUser()
{
return LoggedInUser != null;
}
protected void setUserId(int userId)
{
Session[UserIdKey] = userId;
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Da in der gesamten Anwendung Zugriff auf den eingeloggten User möglich sein soll, verlagern wir die entsprechende Funktion in einen Basis-Controller, von dem dann alle anderen Controller abgeleitet werden.
Die Klasse BaseController ist von Controller abgeleitet, so dass weiterhin alle abgeleiteten Controller auch von diesem Typ sind.
Außerdem enthält die Klasse eine Deklaration und Initialisierung des Datenbankadapters.
public class BaseController : Controller
{
protected BibliothekModelContainer db =
new BibliothekModelContainer();
private static String UserIdKey = "UserId";
public User setUser()
{
...
}
private User _LoggedInUser = null;
protected User LoggedInUser => _LoggedInUser?? setUser();
protected bool hasUser()
{
return LoggedInUser != null;
}
protected void setUserId(int userId)
{
Session[UserIdKey] = userId;
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Da in der gesamten Anwendung Zugriff auf den eingeloggten User möglich sein soll, verlagern wir die entsprechende Funktion in einen Basis-Controller, von dem dann alle anderen Controller abgeleitet werden.
Die Klasse BaseController ist von Controller abgeleitet, so dass weiterhin alle abgeleiteten Controller auch von diesem Typ sind.
Außerdem enthält die Klasse eine Deklaration und Initialisierung des Datenbankadapters.
public class BaseController : Controller
{
protected BibliothekModelContainer db =
new BibliothekModelContainer();
private static String UserIdKey = "UserId";
public User setUser()
{
...
}
private User _LoggedInUser = null;
protected User LoggedInUser => _LoggedInUser?? setUser();
protected bool hasUser()
{
return LoggedInUser != null;
}
protected void setUserId(int userId)
{
Session[UserIdKey] = userId;
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Mit dem Objekt Session stellt der Web-Server eine Funktion bereit um Daten spezifisch für eine Benutzersession abzulegen.
Die Methode setUser() liest aus der Session mittels des statischen Schlüssels UserIdKey diese ID aus.
public class BaseController : Controller
{
...
private static String UserIdKey = "UserId";
public User setUser()
{
int? userId = Session[UserIdKey] as int?;
if (userId == null) return null;
User res = db.Users.Find(userId);
if (res == null) return null;
ViewBag.User = res;
_LoggedInUser = res;
return res;
}
...
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Mit dem Objekt Session stellt der Web-Server eine Funktion bereit um Daten spezifisch für eine Benutzersession abzulegen.
Die Methode setUser() liest aus der Session mittels des statischen Schlüssels UserIdKey diese ID aus.
Beschafft dann mittels Find() das entsprechende Objekt aus der Datenbank ...
public class BaseController : Controller
{
...
private static String UserIdKey = "UserId";
public User setUser()
{
int? userId = Session[UserIdKey] as int?;
if (userId == null) return null;
User res = db.Users.Find(userId);
if (res == null) return null;
ViewBag.User = res;
_LoggedInUser = res;
return res;
}
...
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Mit dem Objekt Session stellt der Web-Server eine Funktion bereit um Daten spezifisch für eine Benutzersession abzulegen.
Die Methode setUser() liest aus der Session mittels des statischen Schlüssels UserIdKey diese ID aus.
Beschafft dann mittels Find() das entsprechende Objekt aus der Datenbank, legt dieses zur Benutzung durch den View im ViewBag ab...
public class BaseController : Controller
{
...
private static String UserIdKey = "UserId";
public User setUser()
{
int? userId = Session[UserIdKey] as int?;
if (userId == null) return null;
User res = db.Users.Find(userId);
if (res == null) return null;
ViewBag.User = res;
_LoggedInUser = res;
return res;
}
...
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Mit dem Objekt Session stellt der Web-Server eine Funktion bereit um Daten spezifisch für eine Benutzersession abzulegen.
Die Methode setUser() liest aus der Session mittels des statischen Schlüssels UserIdKey diese ID aus.
Beschafft dann mittels Find() das entsprechende Objekt aus der Datenbank, legt dieses zur Benutzung durch den View im ViewBag ab und stellt es im Attribut LoggedInUser und als Rückgabe bereit.
public class BaseController : Controller
{
...
private static String UserIdKey = "UserId";
public User setUser()
{
int? userId = Session[UserIdKey] as int?;
if (userId == null) return null;
User res = db.Users.Find(userId);
if (res == null) return null;
ViewBag.User = res;
_LoggedInUser = res;
return res;
}
...
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Der Rest des BaseControllers sind Methoden, die den Zugriff auf den eingeloggten User erleichtern:
public class BaseController : Controller
{
protected BibliothekModelContainer db =
new BibliothekModelContainer();
private static String UserIdKey = "UserId";
public User setUser()
{
...
}
private User _LoggedInUser = null;
protected User LoggedInUser => _LoggedInUser?? setUser();
protected bool hasUser()
{
return LoggedInUser != null;
}
protected void setUserId(int userId)
{
Session[UserIdKey] = userId;
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Der Rest des BaseControllers sind Methoden, die den Zugriff auf den eingeloggten User erleichtern:
Das Property LoggedInUser und das Schatten-Attribut _LoggedInUser stellen einen simplen Lazy-Zugriff auf das User-Objekt bereit. Beschafft wird das Objekt über die Methode setUser()
public class BaseController : Controller
{
protected BibliothekModelContainer db =
new BibliothekModelContainer();
private static String UserIdKey = "UserId";
public User setUser()
{
...
}
private User _LoggedInUser = null;
protected User LoggedInUser => _LoggedInUser?? setUser();
protected bool hasUser()
{
return LoggedInUser != null;
}
protected void setUserId(int userId)
{
Session[UserIdKey] = userId;
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Der Rest des BaseControllers sind Methoden, die den Zugriff auf den eingeloggten User erleichtern:
Das Property LoggedInUser und das Schatten-Attribut _LoggedInUser stellen einen simplen Lazy-Zugiff auf das User-Objekt bereit. Beschafft wird das Objekt über die Methode setUser()
Die Methode hasUser() prüft, ob es einen eingeloggten User gibt.
public class BaseController : Controller
{
protected BibliothekModelContainer db =
new BibliothekModelContainer();
private static String UserIdKey = "UserId";
public User setUser()
{
...
}
private User _LoggedInUser = null;
protected User LoggedInUser => _LoggedInUser?? setUser();
protected bool hasUser()
{
return LoggedInUser != null;
}
protected void setUserId(int userId)
{
Session[UserIdKey] = userId;
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Der Rest des BaseControllers sind Methoden, die den Zugriff auf den eingeloggten User erleichtern:
Das Property LoggedInUser und das Schatten-Attribut _LoggedInUser stellen einen simplen Lazy-Zugiff auf das User-Objekt bereit. Beschafft wird das Objekt über die Methode setUser()
Die Methode hasUser() prüft, ob es einen eingeloggten User gibt.
Mittels der Methode setUserId() kann der eingeloggte User für die Session gesetzt werden...
public class BaseController : Controller
{
protected BibliothekModelContainer db =
new BibliothekModelContainer();
private static String UserIdKey = "UserId";
public User setUser()
{
...
}
private User _LoggedInUser = null;
protected User LoggedInUser => _LoggedInUser?? setUser();
protected bool hasUser()
{
return LoggedInUser != null;
}
protected void setUserId(int userId)
{
Session[UserIdKey] = userId;
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Basis-Controller
Mittels der Methode setUserId() kann der eingeloggte User für die Session gesetzt werden...
public class BaseController : Controller
{
protected BibliothekModelContainer db =
new BibliothekModelContainer();
private static String UserIdKey = "UserId";
public User setUser()
{
...
}
private User _LoggedInUser = null;
protected User LoggedInUser => _LoggedInUser?? setUser();
protected bool hasUser()
{
return LoggedInUser != null;
}
protected void setUserId(int userId)
{
Session[UserIdKey] = userId;
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
LoginController
Mittels der Methode setUserId() kann der eingeloggte User für die Session gesetzt werden und deshalb wird diese Methode in der Select()-Methode nach den Prüfungen im LoginController aufgerufen.
public class LoginController : BaseController
{
// GET: Login
public ActionResult Index()
{
return View(db.Users.ToList());
}
// GET: Login/Details/5
public ActionResult Select(int? id)
{
if (id == null)
{
return new
HttpStatusCodeResult(
HttpStatusCode.BadRequest);
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
setUserId(id.Value);
return RedirectToAction("Index");
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
LoginController
Mittels der Methode setUserId() kann der eingeloggte User für die Session gesetzt werden und deshalb wird diese Methode in der Select()-Methode nach den Prüfungen im LoginController aufgerufen.
Die Rückgabe bleibt dann die Weiterleitung auf den Index, als in unserem Fall die Seite mit der Auswahl des eingeloggten Users.
public class LoginController : BaseController
{
// GET: Login
public ActionResult Index()
{
return View(db.Users.ToList());
}
// GET: Login/Details/5
public ActionResult Select(int? id)
{
if (id == null)
{
return new
HttpStatusCodeResult(
HttpStatusCode.BadRequest);
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
setUserId(id.Value);
return RedirectToAction("Index");
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
LoginController
Mittels der Methode setUserId() kann der eingeloggte User für die Session gesetzt werden und deshalb wird diese Methode in der Select()-Methode nach den Prüfungen im LoginController aufgerufen.
Die Rückgabe bleibt dann die Weiterleitung auf den Index, als in unserem Fall die Seite mit der Auswahl des eingeloggten Users.
Da der BaseController schon einen Datenbankadapter enthält, kann dessen Deklaration und Initialisierung in allen abgeleiteten Controllern entfallen.
public class LoginController : BaseController
{
// GET: Login
public ActionResult Index()
{
return View(db.Users.ToList());
}
// GET: Login/Details/5
public ActionResult Select(int? id)
{
if (id == null)
{
return new
HttpStatusCodeResult(
HttpStatusCode.BadRequest);
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
setUserId(id.Value);
return RedirectToAction("Index");
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Übersicht
Pseudologin
Datensetup
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Allgemeine Controller
Neben den Controllern, die auf Basis einer Datenklasse erstellt werden, können auch allgemeine Controller, die zur Darstellung allgemeiner Seiten oder Durchführung einfacher Funktionen dienen, erstellt werden.
Mit dem HomeController kennen Sie bereits einen solchen Controller.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Allgemeine Controller
Neben den Controllern, die auf Basis einer Datenklasse erstellt werden, können auch allgemeine Controller, die zur Darstellung allgemeiner Seiten oder Durchführung einfacher Funktionen dienen, erstellt werden.
Mit dem HomeController kennen Sie bereits einen solchen Controller.
Für dieses Beispiel nennen Sie den Controller SetupController.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
SetupController
Der Generierte Controller enthält keinen Datenbankadapter und nur eine Methode Index.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace BibliothekWebApp.Controllers
{
public class SetupController : Controller
{
// GET: Setup
public ActionResult Index()
{
return View();
}
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
SetupController
Der Generierte Controller enthält keinen Datenbankadapter und nur eine Methode Index.
Durch die Änderung der Superklasse auf BaseController erhält der SetupController einen Datenbankadapter.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace BibliothekWebApp.Controllers
{
public class SetupController : BaseController
{
public ActionResult Import()
{
...
return View();
}
public ActionResult ClearAll()
{
...
return RedirectToAction("Index", "Home");
}
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
SetupController
Der Generierte Controller enthält keinen Datenbankadapter und nur eine Methode Index.
Durch die Änderung der Superklasse auf BaseController erhält der SetupController einen Datenbankadapter.
Außerdem wird eine Methode Import() eingefügt, die einen View mit dem Importfortschritt erzeugen wird.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace BibliothekWebApp.Controllers
{
public class SetupController : BaseController
{
public ActionResult Import()
{
...
return View();
}
public ActionResult ClearAll()
{
...
return RedirectToAction("Index", "Home");
}
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
SetupController
Der Generierte Controller enthält keinen Datenbankadapter und nur eine Methode Index.
Durch die Änderung der Superklasse auf BaseController erhält der SetupController einen Datenbankadapter.
Außerdem wird eine Methode Import() eingefügt, die einen View mit dem Importfortschritt erzeugen wird.
Zum Zurücksetzen der Datenbank gibt es noch eine Methode ClearAll(), die einfach eine Weiterleitung auf die Startseite zurückgibt.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace BibliothekWebApp.Controllers
{
public class SetupController : BaseController
{
public ActionResult Import()
{
...
return View();
}
public ActionResult ClearAll()
{
...
return RedirectToAction("Index", "Home");
}
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
SetupController
Der Generierte Controller enthält keinen Datenbankadapter und nur eine Methode Index.
Durch die Änderung der Superklasse auf BaseController erhält der SetupController einen Datenbankadapter.
Außerdem wird eine Methode Import() eingefügt, die einen View mit dem Importfortschritt erzeugen wird.
Zum Zurücksetzen der Datenbank gibt es noch eine Methode ClearAll(), die einfach eine Weiterleitung auf die Startseite zurückgibt.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace BibliothekWebApp.Controllers
{
public class SetupController : BaseController
{
public ActionResult Import()
{
...
return View();
}
public ActionResult ClearAll()
{
...
return RedirectToAction("Index", "Home");
}
}
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
ClearAll()
Die Methode ClearAll() löscht alle Elemente aus der Datenbank.
public ActionResult ClearAll()
{
foreach (var user in db.Users)
{
user.Orders.Clear();
user.Loans.Clear();
}
Context.SaveChanges();
foreach (var work in db.Works)
{
work.Orderer.Clear();
}
db.SaveChanges();
db.Media.RemoveRange(db.Media);
db.SaveChanges();
db.Users.RemoveRange(db.Users);
db.SaveChanges();
db.Works.RemoveRange(db.Works);
db.SaveChanges();
return RedirectToAction("Index", "Home");
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Import()
Die Methode Import() erzeugt aus zwei Strings, die im Quelltext eingebunden sind und csv-Daten enthalten, Benutzer und Bücher.
string UsersData = "...";
string BooksData = "...";
public ActionResult Import()
{
IEnumerable<string>[] actions = new[]
{
UsersData
.Split(Environment.NewLine.ToCharArray())
.Where(
line =>
!String.IsNullOrWhiteSpace(line.Trim()))
.SelectMany(
line => createUser(line.Split(';'))),
BooksData
.Split(Environment.NewLine.ToCharArray())
.Where(
line =>
!String.IsNullOrWhiteSpace(line.Trim()))
.SelectMany(
line => createBook(line.Split(';'))),
};
ViewBag.Messages = actions.SelectMany(a => a).ToList();
Context.SaveChanges();
return View();
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Import()
Die Methode Import() erzeugt aus zwei Strings, die im Quelltext eingebunden sind und csv-Daten enthalten, Benutzer und Bücher.
Dabei werden für jedes eingefügte Element Nachrichten erzeugt. Diese Liste der Nachrichten wird im ViewBag unter Messages abgelegt.
string UsersData = "...";
string BooksData = "...";
public ActionResult Import()
{
IEnumerable<string>[] actions = new[]
{
UsersData
.Split(Environment.NewLine.ToCharArray())
.Where(
line =>
!String.IsNullOrWhiteSpace(line.Trim()))
.SelectMany(
line => createUser(line.Split(';'))),
BooksData
.Split(Environment.NewLine.ToCharArray())
.Where(
line =>
!String.IsNullOrWhiteSpace(line.Trim()))
.SelectMany(
line => createBook(line.Split(';'))),
};
ViewBag.Messages = actions.SelectMany(a => a).ToList();
Context.SaveChanges();
return View();
}
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Import-View
Analog zu den Controllern können auch Views aus Vorlagen erstellt werden.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Import-View
Analog zu den Controllern können auch Views aus Vorlagen erstellt werden.
Benenen Sie den View in Import um, so dass der Name zur Import()-Methode passt.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Import-View
Analog zu den Controllern können auch Views aus Vorlagen erstellt werden.
Benenen Sie den View in Import um, so dass der Name zur Import()-Methode passt.
Der neue View ist zunächst leer.
View
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Import-View
<div>
<h4>Import</h4>
<hr />
<dl class="dl-horizontal">
@{int i = 0;}
@foreach (var message in ViewBag.Messages)
{
<dt>
@i
@{ i++; }
</dt>
<dd>
@message
</dd>
}
</dl>
</div>
Analog zu den Controllern können auch Views aus Vorlagen erstellt werden.
Benenen Sie den View in Import um, so dass der Name zur Import()-Methode passt.
Der neue View ist zunächst leer.
Der nebenstehende HTML-Abschnitt zeigt, wie aus dem ViewBag die Messages ausgelesen werden und als Meldungen in HTML eingebettet werden.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Import-View
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Import-View
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink(
"Contact", "Contact", "Home")</li>
<li>@Html.ActionLink("Login", "Index", "Login")</li>
<li>@Html.ActionLink(
"Import", "Import", "Setup")</li>
<li>@Html.ActionLink(
"Reset", "ClearAll", "Setup")</li>
</ul>
</div>
Analog zu den Controllern können auch Views aus Vorlagen erstellt werden.
Benenen Sie den View in Import um, so dass der Name zur Import()-Methode passt.
Der neue View ist zunächst leer.
Der nebenstehende HTML-Abschnitt zeigt, wie aus dem ViewBag die Messages ausgelesen werden und als Meldungen in HTML eingebettet werden.
Für den Aufruf werden wieder ActionLinks in Shared/_Layout eingebaut.
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Import-View
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen
Prof. Dr.-Ing. Jörn Schlingensiepen
https://lehre.schlingensiepen.com
Cliparts aus der Open Clip Art Library
Sushi für's Hirn
ICM@I3CM
Inverted Classroom Model im Institut für Ingenieurinformatik und computergestützte Mathematik (I3CM)
ICM@I3CM
Prof. Dr.-Ing. Jörn Schlingensiepen