Dies ist eine MVC -App, die mit .NET Framework 4.8 für Lernzwecke entwickelt wurde.
Aktionsergebnisse
| Typ | Helfermethode |
|---|---|
| ViewResult | Sicht() |
| PartialViewResult | PartialView () |
| ContentResult | Inhalt() |
| Umbau | Umleiten() |
| RecirectTorouteresult | RecirectToAction () |
| JsonResult | JSON () |
| Fileresult | Datei() |
| HttpnotfoundResult | Httpnotfound () |
| LeereResult | - - |
einige Beispiele
public ActionResult Test ( )
{
return View ( data ) ;
return Content ( "Hello World!" ) ;
return HttpNotFound ( ) ;
return new EmptyResult ( ) ;
return RedirectToAction ( "Index" , "Home" , new { page = "1" , sortBy = "name" } ) ;
} Konventionsbasiertes Routing: in RouteConfig.cs
routes . MapRoute (
"MoviesByReleaseDate" , //name of route
"movies/released/{year}/{month}" , //route url
new { controller = "Movies" , action = "ByReleaseDate" } , //default corresponding controller and actions
new { year = @"2020|2021" , month = @"d{2}" } ) ; //constraints for parameters Attribut -Routing : In RouteConfig.cs add routes.MapMvcAttributeRoutes(); Verwenden Sie vor dem Controller Attribut [Route("url template")] . Auch Einschränkungen wie min, max, minLength, maxLength, int, float, Guid könnten verwendet werden.
[ Route ( "movies/released/{year:regex( \ d{4}:range(1800,2021))}/{month:regex( \ d{2}:range(1,12))}" ) ]
public ActionResult ByReleaseDate ( int year , int month )
{
return Content ( year + "/" + month ) ;
} public ActionResult Test ( )
{
var movie = new Movie ( ) { Name = "Shrek!" } ;
ViewData [ "Movie" ] = movie ;
ViewBag . Movie = movie ;
return View ( movie ) ;
} < h2 > @Model.Name </ h2 > <!-- preffered way -->
< h2 > @( ((Movie) ViewData["Movie"]).Name) </ h2 > <!-- ugly way / dont use -->
< h2 > @ViewBag.Movie.Name </ h2 > <!-- casted at runtime / not safe --> public class RandomMovieViewModel
{
public Movie Movie { get ; set ; }
public List < Customer > Customers { get ; set ; }
} public class MoviesController : Controller
{
// GET: Movies
public ActionResult Random ( )
{
//adding data
var movie = new Movie ( ) { Name = "Shrek!" } ;
var customers = new List < Customer >
{
new Customer { Name = "cust1" } ,
new Customer { Name = "cust2" }
} ;
//filing viewmodel with data
var viewModel = new RandomMovieViewModel ( )
{
Movie = movie ,
Customers = customers
} ;
return View ( viewModel ) ;
}@ *
this is a razor comment
* @
@ {
//multiple lines
//when razor sees html prints it and when razor sees csharp interprets it
}
@ {
var className = Model . Customers . Count > 0 ? "popular" : null ;
}
< h2 class = "@className" > @Model . Movie . Name < / h2 > < ! -- preferred way -- >
@if ( Model . Customers . Count == 0 )
{
< p > No one has rented this movie before . < / p >
}
< ul >
@foreach ( var customer in Model . Customers )
{
< li > @customer . Name < / li >
}
< / ul > Erstellen Sie die Ansicht in Ansichten als Ansicht und wählen Sie Teilansicht. Verwendung in anderen Ansichten @Html.Partial("_PartialView", Model.Data)




Entity Framework: Ein ORM, das Daten in einer relationalen Datenbank in unseren Objekten mithilfe der Kontextdatei abbildert.
LINQ: Methode wie SQL -Abfragen.
Workflows: Datenbank zuerst, zuerst Code.
DB zuerst: Entwerfen Sie Datenbanktabellen zuerst, später lassen Sie EF Domänenklassen gemäß den Tabellen generieren.
Zuerst Code: Erstellen Sie zuerst Domänenklassen, später lassen Sie EF Datenbanktabellen für uns generieren.
DBSET to Table-Name im Kontext: DBContext-Klasse in Package Manager-Konsole PM PM> update-database PM> add-migration migrationName PM > enable-migrations
DB Seeding: SQL -Befehle in eine Migrations Up () -Methode einlegen
in Controller
private Context _context ;
public CustomersController ( )
{
_context = new Context ( ) ;
}
//...
public ActionResult Index ( )
{
var customers = _context . Customers . ToList ( ) ;
return View ( customers ) ;
}
//...
public ActionResult Details ( int id )
{
var customer = _context . Customers . Single ( c => c . Id == id ) ;
return View ( customer ) ;
} Last relationaler Fremdtabelle : _context.Customer.Include(c=>c.MembershipType).ToList();





In Anbetracht:
@using ( Html . BeginForm ( actionName : "Create" , controllerName : "Customers" ) )
{
< div class = "form-group" >
@Html . LabelFor ( m => m . Name )
@Html . TextBoxFor ( m => m . Name , new { @class = "form-control" } )
< / div >
} im Modell mit Datenanmerkungen:
[ Display ( Name = "Date of Birth" ) ]
public DateTime ? Birthdate { get ; set ; } oder im Hinblick auf <label for="Birthdate">Date of Birth</label>
ViewModel erstellen:
public class NewCustomerViewModel
{
public IEnumerable < MembershipType > MembershipTypes { get ; set ; }
public Customer Customer { get ; set ; }
}in Controller:
var membershipTypes = _context . MembershipTypes . ToList ( ) ;
var viewModel = new NewCustomerViewModel ( )
{
MembershipTypes = membershipTypes
} ;In Anbetracht:
< div class =" form-group " >
@Html.LabelFor(m = > m.Customer.MembershipTypeId)
@Html.DropDownListFor(m = > m.Customer.MembershipTypeId, new SelectList(Model.MembershipTypes,"Id","Name"),"Select Membership Type", new { @class = "form-control" })
</ div > in Controller:
[ HttpPost ]
public ActionResult Create ( Customer customer )
{
//...
return View ( ) ;
}Stellen Sie in der Ansicht nach dem Aktionsnamen und dem Controller -Namen sicher
( Html . BeginForm ( actionName : "Create" , controllerName : "Customers" ) )
//... [ HttpPost ]
public ActionResult Create ( Customer customer )
{
_context . Customers . Add ( customer ) ;
_context . SaveChanges ( ) ;
return RedirectToAction ( "Index" , "Customers" ) ;
} Füllen Sie Daten mit entsprechendem Element aus der ID in Controller aus:
public ActionResult Edit ( int id )
{
var customer = _context . Customers . SingleOrDefault ( c => c . Id == id ) ;
if ( customer == null )
return HttpNotFound ( ) ;
var viewModel = new CustomerFormViewModel ( )
{
Customer = customer ,
MembershipTypes = _context . MembershipTypes . ToList ( )
} ;
return View ( "CustomerForm" , viewModel ) ;
}
} Wenn nicht existiert, fügen Sie hinzu, wenn das Update existiert. In Controller müssen Sie die Attribute abgeben
public ActionResult Save ( Customer customer )
{
if ( customer . Id == 0 )
_context . Customers . Add ( customer ) ;
else
{
var customerInDb = _context . Customers . Single ( c => c . Id == customer . Id ) ;
customerInDb . Name = customer . Name ;
customerInDb . Birthdate = customer . Birthdate ;
customerInDb . MembershipTypeId = customer . MembershipTypeId ;
customerInDb . IsSubscribedToNewsletter = customer . IsSubscribedToNewsletter ;
}
_context . SaveChanges ( ) ;
return RedirectToAction ( "Index" , "Customers" ) ;
}Fügen Sie das Feld abhängiger ID in der Ansicht als versteckt hinzu:
@Html.HiddenFor(m= > m.Customer.Id)


STEP1: Anmerkungen im Modell hinzufügen, Schritt 2: Hinzufügen der Validierungsregelung in Controller. Wenn Sie kein gültiges Rückgabeformular mit Benutzerndaten haben
if ( ! ModelState . IsValid )
{
var viewModel = new CustomerFormViewModel
{
Customer = customer ,
MembershipTypes = _context . MembershipTypes . ToList ( )
} ;
return View ( "CustomerForm" , viewModel ) ;
}Schritt 3: Fügen Sie Validierungsnachricht zum Anzeigen hinzu:
@Html.ValidationMessageFor(m= > m.Customer.Name)Styling -Validierungsfehler zugreifen auf diese Klassen und stylize:
. field-validation-error {
color : red;
}
. input-validation-error {
border : 2 px red;
}Übergeordnete Validierungsnachricht im Modell hinzufügen dies zu den erforderlichen Datenanmerkungen
[ Required ( ErrorMessage = "Please enter customer's name." ) ]
[ StringLength ( 255 ) ]
public string Name { get ; set ; } SCHRITT1: Erstellen Sie eine Klasse, die ValidationAttribute erbt (mit System.comPonentModel.Dataannotations)
public class Min18YearsIfAMember : ValidationAttribute
{
protected override ValidationResult IsValid ( object value , ValidationContext validationContext )
{
var customer = ( Customer ) validationContext . ObjectInstance ;
if ( customer . MembershipTypeId == 0 || customer . MembershipTypeId == 1 )
{
return ValidationResult . Success ;
}
if ( customer . Birthdate == null )
{
return new ValidationResult ( "Birthdate is required." ) ;
}
var age = DateTime . Today . Year - customer . Birthdate . Value . Year ;
return ( age >= 18 )
? ValidationResult . Success
: new ValidationResult ( "Customer should be at least 18 years old to go on a membership." )
}
}SCHRITT2: Datenanmerkungen zum Modell hinzufügen
[ Display ( Name = "Membership Type" ) ]
[ Min18YearsIfAMember ]
public byte MembershipTypeId { get ; set ; }Schritt 3: Meldung zur Anzeige hinzufügen
@Html.ValidationMessageFor(m= > m.Customer.MembershipTypeId)@Html.ValidationSummary(true, "Please fix the following errors.")AusschlusspropertypeRors: TRUE versteckt die individuelle Fehlerlistenmeldung: Die angezeigte Nachricht an den Benutzer (könnte stilisiert werden)
Fügen Sie dies zu Formularen im Blickfeld hinzu
@section scripts {
@Scripts . Render ( "~/bundles/jqueryval" )
} In Ansichten verwenden Sie diesen HTML -Helfer:
@Html . AntiForgeryToken ( )und in der Controller -Aktion fügen Sie diese Datenanmerkungen hinzu:
In Controllern erstellen eine Web -API und fügen Sie diese zu global.asax.js hinzu:
GlobalConfiguration . Configure ( WebApiConfig . Register ) ;In Controller initialisieren Sie den Kontext:
private Context _context ;
public CustomersController ( )
{
_context = new Context ( ) ;
}Erstellen Sie GET/Post/Put -Methoden wie: Get ALL:
//GET /api/customers
[ HttpGet ]
public IEnumerable < Customer > GetCustomers ( )
{
return _context . Customers . ToList ( ) ;
}Holen Sie sich einen:
//GET /api/customers/1
[ HttpGet ]
public Customer GetCustomer ( int id )
{
var customer = _context . Customers . SingleOrDefault ( c => c . Id == id ) ;
if ( customer == null )
throw new HttpResponseException ( HttpStatusCode . NotFound ) ;
return customer ;
}Erstellen:
//POST /api/customers
[ HttpPost ]
public Customer CreateCustomer ( Customer customer )
{
if ( ! ModelState . IsValid )
throw new HttpResponseException ( HttpStatusCode . BadRequest ) ;
_context . Customers . Add ( customer ) ;
_context . SaveChanges ( ) ;
return customer ;
}Aktualisieren:
//PUT /api/customers/1
[ HttpPut ]
public void UpdateCustomer ( int id , Customer customer )
{
if ( ! ModelState . IsValid )
throw new HttpResponseException ( HttpStatusCode . BadRequest ) ;
var customerInDb = _context . Customers . SingleOrDefault ( c => c . Id == id ) ;
if ( customerInDb == null )
throw new HttpResponseException ( HttpStatusCode . NotFound ) ;
customerInDb . Name = customer . Name ;
customerInDb . Birthdate = customer . Birthdate ;
customerInDb . IsSubscribedToNewsletter = customer . IsSubscribedToNewsletter ;
customerInDb . MembershipTypeId = customer . MembershipTypeId ;
_context . SaveChanges ( ) ;
}Löschen:
//DELETE /api/customers/1
[ HttpDelete ]
public void DeleteCustomer ( int id )
{
var customerInDb = _context . Customers . SingleOrDefault ( c => c . Id == id ) ;
if ( customerInDb == null )
throw new HttpResponseException ( HttpStatusCode . NotFound ) ;
_context . Customers . Remove ( customerInDb ) ;
_context . SaveChanges ( ) ;
}Test mit Postboten
Domänenobjekte, die wir die Daten entfernen, die wir nicht geändert oder angezeigt werden möchten. Für unsere Bedürfnisse geformt. Speichern Sie im DTOS -Ordner
In app_start erstellen mapingProfile.cs:
public class MappingProfile : Profile
{
public MappingProfile ( )
{
Mapper . CreateMap < Customer , CustomerDto > ( ) ;
Mapper . CreateMap < CustomerDto , Customer > ( ) ;
}
}Fügen Sie Mapper zu global.asax.cs hinzu
protected void Application_Start ( )
{
Mapper . Initialize ( c => c . AddProfile < MappingProfile > ( ) ) ;
//..
}Aktualisieren von Controller -Aktionen:
//GET /api/customers
[ HttpGet ]
public IEnumerable < CustomerDto > GetCustomers ( )
{
return _context . Customers . ToList ( ) . Select ( Mapper . Map < Customer , CustomerDto > ) ;
} //GET /api/customers/1
[ HttpGet ]
public CustomerDto GetCustomer ( int id )
{
var customer = _context . Customers . SingleOrDefault ( c => c . Id == id ) ;
if ( customer == null )
throw new HttpResponseException ( HttpStatusCode . NotFound ) ;
return Mapper . Map < Customer , CustomerDto > ( customer ) ;
} //POST /api/customers
[ HttpPost ]
public CustomerDto CreateCustomer ( CustomerDto customerDto )
{
if ( ! ModelState . IsValid )
throw new HttpResponseException ( HttpStatusCode . BadRequest ) ;
var customer = Mapper . Map < CustomerDto , Customer > ( customerDto ) ;
_context . Customers . Add ( customer ) ;
_context . SaveChanges ( ) ;
customerDto . Id = customer . Id ;
return customerDto ;
} //PUT /api/customers/1
[ HttpPut ]
public void UpdateCustomer ( int id , CustomerDto customerDto )
{
if ( ! ModelState . IsValid )
throw new HttpResponseException ( HttpStatusCode . BadRequest ) ;
var customerInDb = _context . Customers . SingleOrDefault ( c => c . Id == id ) ;
if ( customerInDb == null )
throw new HttpResponseException ( HttpStatusCode . NotFound ) ;
Mapper . Map ( customerDto , customerInDb ) ;
_context . SaveChanges ( ) ;
} In app_start webapiconfig.cs fügen Sie im Register hinzu
var settings = config . Formatters . JsonFormatter . SerializerSettings ;
settings . ContractResolver = new CamelCasePropertyNamesContractResolver ( ) ;
settings . Formatting = Formatting . Indented ; Richtige HTTP -Ergebnisse für unsere Aktionen:
//GET /api/customers/1
[ HttpGet ]
public IHttpActionResult GetCustomer ( int id )
{
var customer = _context . Customers . SingleOrDefault ( c => c . Id == id ) ;
if ( customer == null )
return NotFound ( ) ;
return Ok ( Mapper . Map < Customer , CustomerDto > ( customer ) ) ;
} //POST /api/customers
[ HttpPost ]
public IHttpActionResult CreateCustomer ( CustomerDto customerDto )
{
if ( ! ModelState . IsValid )
return BadRequest ( ) ;
var customer = Mapper . Map < CustomerDto , Customer > ( customerDto ) ;
_context . Customers . Add ( customer ) ;
_context . SaveChanges ( ) ;
customerDto . Id = customer . Id ;
return Created ( new Uri ( Request . RequestUri + "/" + customer . Id ) , customerDto ) ;
} Postman: Get: https: // localhost: 44362/api/movies 200 ok
[
{
"id" : 1 ,
"name" : " Citizen Kane " ,
"genreId" : 3 ,
"dateAdded" : " 1900-01-01T00:00:00 " ,
"releaseDate" : " 1941-01-01T00:00:00 " ,
"numberInStock" : 4
},
{
"id" : 3 ,
"name" : " Rear Window " ,
"genreId" : 10 ,
"dateAdded" : " 1900-01-01T00:00:00 " ,
"releaseDate" : " 1954-01-01T00:00:00 " ,
"numberInStock" : 3
},
//.......
]Get: https: // localhost: 44362/api/movies/7 200 ok
{
"id" : 7 ,
"name" : " The Good, the Bad and the Ugly " ,
"genreId" : 6 ,
"dateAdded" : " 1900-01-01T00:00:00 " ,
"releaseDate" : " 1966-01-01T00:00:00 " ,
"numberInStock" : 1
}Beitrag: https: // localhost: 44362/api/filme 201 erstellt
{
"name" : " Life Is Beautiful " ,
"genreId" : 3 ,
"dateAdded" : " 1900-01-01T00:00:00 " ,
"releaseDate" : " 1997-01-01T00:00:00 " ,
"numberInStock" : 1
}Put: https: // localhost: 44362/api/movies/11 204 Kein Inhalt
{
"name" : " Life Is Beautiful " ,
"genreId" : 3 ,
"dateAdded" : " 1900-01-01T00:00:00 " ,
"releaseDate" : " 1997-01-01T00:00:00 " ,
"numberInStock" : 5
}Löschen: https: // localhost: 44362/api/movies/12 204 kein Inhalt
Fügen Sie in Sichtweise Klassen, Daten und ID zu Elementen hinzu. und am Endeskript:
< table id =" customers " < ---
class =" table table-borderless " >
< tr class =" danger " >
< th > Customers </ th >
....
....
< td >
< button data-customer-id =" @item.Id " < ---
class =" btn-link js-delete " < ---
>
Delete
</ button >
</ td >
.....
@section scripts{
< script >
$ ( document ) . ready ( function ( ) {
$ ( "#customers .js-delete" ) . on ( "click" , function ( ) {
var button = $ ( this ) ;
if ( confirm ( "sure to delete?" ) ) {
$ . ajax ( {
url : "/api/customers/" + button . attr ( "data-customer-id" ) ,
method : "DELETE" ,
success : function ( ) {
alert ( "success" ) ;
button . parents ( "tr" ) . remove ( ) ;
}
} ) ;
}
} ) ;
} ) ;
</ script >
} Fügen Sie in bundleconfig.cs hinzu:
bundles . Add ( new ScriptBundle ( "~/bundles/bootstrap" ) . Include (
"~/Scripts/bootstrap.js" ,
"~/Scripts/bootbox.js" , //<--- here
"~/Scripts/respond.js"
) ) ;im Sichtweise implementieren:
@section scripts{
< script >
$ ( document ) . ready ( function ( ) {
$ ( "#customers .js-delete" ) . on ( "click" , function ( ) {
var button = $ ( this ) ;
bootbox . confirm ( "sure to delete?" , function ( result ) {
if ( result ) {
$ . ajax ( {
url : "/api/customers/" + button . attr ( "data-customer-id" ) ,
method : "DELETE" ,
success : function ( ) {
alert ( "success" ) ;
button . parents ( "tr" ) . remove ( ) ;
}
} ) ;
}
} ) ;
} ) ;
} ) ;
</ script >
} Zu den Bündeln hinzufügen: (und wir haben Bündel Dritter zu lib. In _layout.cshtml -> @Scripts.Render("~/bundles/lib") zusammengefasst)
bundles . Add ( new ScriptBundle ( "~/bundles/lib" ) . Include (
"~/Scripts/jquery-{version}.js" ,
"~/Scripts/bootstrap.js" ,
"~/Scripts/bootbox.js" ,
"~/Scripts/respond.js" ,
"~/Scripts/DataTables/jquery.dataTables.js" , //<--
"~/Scripts/DataTables/dataTables.bootstrap.js" //<--
) ) ; bundles . Add ( new StyleBundle ( "~/Content/css" ) . Include (
"~/Content/bootstrap.css" ,
"~/content/datatables/css/dataTables.bootstrap.css" , //<-- style
"~/Content/site.css" ) ) ;In Ansicht sollten Tabellen ID und thead, tbody Tags haben. Zuletzt im Skriptabschnitt, wenn das Dokument bereit ist:
$ ( document ) . ready ( function ( ) {
$ ( "#customers" ) . DataTable ( ) ;
//...
} In JQuery DataTable Call:
$ ( document ) . ready ( function ( ) {
$ ( "#customers" ) . DataTable ( {
ajax : {
url : "/api/customers" ,
dataSrc : ""
} ,
columns : [
{
data : "name" ,
render : function ( data , type , customer ) {
return "<a href='/customers/edit/'" + customer . id + "'>" + customer . name ;
}
} ,
{
data : "membershipType.name"
} ,
{
data : "id" ,
render : function ( data ) {
return "<button class='btn-link js-delete' data-customer-id=" + data + ">Delete</button>" ;
}
}
]
} ) ; Schritt 1: Erstellen Sie DTO, Schritt 2: Hinzufügen von DTO zu übergeordnetem DTO Schritt 3. MAP IM Mapping -Profil Schritt 4: Hinzufügen zum Controller (._AppdbContext.Customers.include (c => c.MembersshipType) .tolist () ..) Schritt 5: Hinzufügen, um die Spalte anzusehen wie:
{
data : "membershipType.name"
} , Die Tabelle der Variablen zuweisen und in der Methode entfernen:
< script >
$ ( document ) . ready ( function ( ) {
var table //<--
= $ ( "#customers" ) . DataTable ( {
ajax : {
url : "/api/customers" ,
dataSrc : ""
} ,
columns : [
{
data : "name" ,
render : function ( data , type , customer ) {
return "<a href='/customers/edit/'" + customer . id + "'>" + customer . name ;
}
} ,
{
data : "membershipType.name"
} ,
{
data : "id" ,
render : function ( data ) {
return "<button class='btn-link js-delete' data-customer-id=" + data + ">Delete</button>" ;
}
}
]
} ) ;
$ ( "#customers" ) . on ( "click" , ".js-delete" , function ( ) {
var button = $ ( this ) ;
bootbox . confirm ( "Are you sure you want to delete this customer?" , function ( result ) {
if ( result ) {
$ . ajax ( {
url : "/api/customers/" + button . attr ( "data-customer-id" ) ,
method : "DELETE" ,
success : function ( ) {
///<--- here
table . row ( button . parents ( "tr" ) )
. remove ( ) . draw ( ) ;
}
} ) ;
}
} ) ;
} ) ;
} ) ;
</ script > 
Die gesamte Logik wird integriert (siehe Litie für Dateien und Details)
Fügen Sie [Autorize] Attribut zu Controller -Aktionen oder zusätzlich zum Controller hinzu, um alle Aktionen einzuschränken
Filterconfig.cs:
filters . Add ( new AuthorizeAttribute ( ) ) ;Dies deaktiviert alle Controller für nicht autorisierte Benutzer, aber Sie können Controllern oder Aktionen [degitanonyme] hinzufügen, um den Zugriff zu aktivieren
Saat der Datenbank : Um die Konsistenz des Projekts in verschiedenen Arbeitsszenarien zu behalten, fügen Sie sie einer Migration hinzu
Erstellen Sie separate Ansichten für Gäste und autorisierte Benutzer
in Controller:
public ViewResult Index ( int ? pageIndex , string sortBy )
{
if ( User . IsInRole ( RoleName . CanManageMovies ) )
return View ( "List" ) ;
return View ( "ReadOnlyList" ) ;
} Um andere Aktionen zu deaktivieren, fügen Sie dieses Attribut hinzu: [Authorize(Roles = RoleName.CanManageMovies)]
Erstellen Sie ein Modell, mit dem Rollen rolename.cs erhalten bleiben:
public const string CanManageMovies = "CanManageMovies" ; So fügen Sie dem Benutzer benutzerdefinierte Felder hinzu: Fügen Sie die Prop sowohl zur Anwendungsbenutzerklasse als auch zum ViewModel der Ansicht hinzu. Fügen Sie auch neue Prop hinzu, um Aktionen zuzuordnen
Aktivieren Sie SSL in Eigenschaften, Filter hinzufügen
filters . Add ( new RequireHttpsAttribute ( ) ) ;Holen Sie sich Appid und AppSecret von Facebook, Google, in startup.auth.cs einfügen
app . UseFacebookAuthentication (
appId : "id" ,
appSecret : "secret" ) ;Fügen Sie dem externen Anmeldeformular und ViewModel alle benutzerdefinierten Requisiten hinzu. Initialisieren Sie im externen Anmeldesteuerer

In Nuget installieren Sie Glimpse.mvc5 und glimpse.ef6 zu /glimse.axd und aktivieren
Caching Deaktivieren: [OutputCache(Duration = 0, VaryByParam = "*", NoStore = true)]
Caching aktivieren:
[OutputCache(Duration=50,Location=OutputCacheLocation.Server,VaryByParam="genre")]
In Controller -Aktion
if ( MemoryCache . Default [ "Genres" ] == null )
{
MemoryCache . Default [ "Genres" ] = _appDbContext . Genres . ToList ( ) ;
}
var genres = MemoryCache . Default [ "Genres" ] as IEnumerable < Genre > ; in web.config in System.web
Wir werden unserer App eine Mietfunktion hinzufügen. Erstellen Sie DTO: NewRentalDTO:
public class NewRentalDto
{
public int CustomerId { get ; set ; }
public List < int > MovieIds { get ; set ; }
}Modell erstellen: Vermietung, hinzufügen zum Kontext und führen Sie eine Migration aus
public class Rental
{
public int Id { get ; set ; }
[ Required ]
public Customer Customer { get ; set ; }
[ Required ]
public Movie Movie { get ; set ; }
public DateTime DateRented { get ; set ; }
public DateTime ? DateReturned { get ; set ; }
}Weitere Details zu Commits. (Gebrauchte Typeakhead, Bluthund für Autokaponete)
Klicken Sie mit der rechten Maustaste und veröffentlichen Sie
PM> update-database -script -SourceMigration:SeedUsers
Zielen Sie MIG an zu dauern. Sie haben jetzt eine SQL -Abfrage Ihrer DB erhalten
In web.config <appSettings key="value"></appSettings> oder eine weitere Konfigurationsdatei erstellen <appSettings configSource="AppSettings.config"></appSettings> Verwenden in Code wie: ConfigurationManager.AppSettings["Key"] Sie müssen es für Ihre Bedürfnisse manuell konvertieren
In web.config zu <system.web> hinzufügen
<customErrors mode="On"></customErrors>
ON: Aktivieren Sie überall Fernbedienung: Deaktivieren Sie auf Localhost
Anpassen in Ansichten> gemeinsamer Fehler.cshtml
In web.config zu <system.web> >> <customErrors> hinzufügen
< system .web>
< customErrors mode = " On " >
< error statusCode = " 404 " redirect = " ~/404.html " />
</ customErrors >
<!-- ..... -->
</ system .web> n web.config zu <system.webServer> hinzufügen
< httpErrors errorMode = " Custom " >
< remove statusCode = " 404 " />
< error statusCode = " 404 " path = " 404.html " responseMode = " File " />
</ httpErrors >Custom: Aktivieren Sie überall detailliert.
Nuget> Elmah
Ausnahmeblogger. Zugriff von /elmah.axd
Standardmäßig speichert es Protokolle im Speicher, aber mit einer kleinen Konfiguration könnten wir diese Ausnahmen zu allen Arten von Datenbanken haben
Für den Zugang zu Elmah fügen Sie dies aus der Ferne hinzu
< authorization >
< allow roles = " admin,user2,user3,... " />
< deny users = " * " />
</ authorization >DANKE!!!