This commit is contained in:
ani_konarcheva@abv.bg
2022-04-01 16:30:44 +03:00
parent 0f3e02cb92
commit aad682be3e
14 changed files with 164 additions and 482 deletions

View File

@@ -1,411 +0,0 @@
// <auto-generated />
using System;
using Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Data.Migrations
{
[DbContext(typeof(RentACarDbContext))]
[Migration("20220328141658_InitialMigration")]
partial class InitialMigration
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("ProductVersion", "5.0.13")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Data.Entities.Car", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("Brand")
.HasColumnType("nvarchar(max)");
b.Property<int>("CountPassengerSeats")
.HasColumnType("int");
b.Property<string>("Description")
.HasColumnType("nvarchar(max)");
b.Property<string>("Model")
.HasColumnType("nvarchar(max)");
b.Property<decimal>("PriceForDay")
.HasColumnType("decimal(18,2)");
b.Property<int>("Year")
.HasColumnType("int");
b.HasKey("Id");
b.ToTable("Cars");
});
modelBuilder.Entity("Data.Entities.Rents", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<int?>("CarId")
.HasColumnType("int");
b.Property<DateTime>("EndDate")
.HasColumnType("datetime2");
b.Property<DateTime>("StartDate")
.HasColumnType("datetime2");
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("CarId");
b.HasIndex("UserId");
b.ToTable("Rents");
});
modelBuilder.Entity("Data.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<int>("AccessFailedCount")
.HasColumnType("int");
b.Property<string>("ConcurrencyStamp")
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.HasColumnType("nvarchar(max)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("bit");
b.Property<string>("FirstName")
.HasColumnType("nvarchar(max)");
b.Property<string>("LastName")
.HasColumnType("nvarchar(max)");
b.Property<bool>("LockoutEnabled")
.HasColumnType("bit");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("datetimeoffset");
b.Property<string>("NormalizedEmail")
.HasColumnType("nvarchar(max)");
b.Property<string>("NormalizedUserName")
.HasColumnType("nvarchar(max)");
b.Property<string>("PasswordHash")
.HasColumnType("nvarchar(max)");
b.Property<string>("PersonalNumber")
.HasColumnType("nvarchar(max)");
b.Property<string>("PhoneNumber")
.HasColumnType("nvarchar(max)");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("bit");
b.Property<string>("SecurityStamp")
.HasColumnType("nvarchar(max)");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("bit");
b.Property<string>("UserName")
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("UserName")
.IsUnique()
.HasFilter("[UserName] IS NOT NULL");
b.ToTable("User");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasDatabaseName("RoleNameIndex")
.HasFilter("[NormalizedName] IS NOT NULL");
b.ToTable("AspNetRoles");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("RoleId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<int>("AccessFailedCount")
.HasColumnType("int");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("bit");
b.Property<bool>("LockoutEnabled")
.HasColumnType("bit");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("datetimeoffset");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<string>("PasswordHash")
.HasColumnType("nvarchar(max)");
b.Property<string>("PhoneNumber")
.HasColumnType("nvarchar(max)");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("bit");
b.Property<string>("SecurityStamp")
.HasColumnType("nvarchar(max)");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("bit");
b.Property<string>("UserName")
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasDatabaseName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasDatabaseName("UserNameIndex")
.HasFilter("[NormalizedUserName] IS NOT NULL");
b.ToTable("AspNetUsers");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<string>("ClaimType")
.HasColumnType("nvarchar(max)");
b.Property<string>("ClaimValue")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderKey")
.HasColumnType("nvarchar(450)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("nvarchar(max)");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("nvarchar(450)");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("RoleId")
.HasColumnType("nvarchar(450)");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId")
.HasColumnType("nvarchar(450)");
b.Property<string>("LoginProvider")
.HasColumnType("nvarchar(450)");
b.Property<string>("Name")
.HasColumnType("nvarchar(450)");
b.Property<string>("Value")
.HasColumnType("nvarchar(max)");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens");
});
modelBuilder.Entity("Data.Entities.Rents", b =>
{
b.HasOne("Data.Entities.Car", "Car")
.WithMany()
.HasForeignKey("CarId");
b.HasOne("Data.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId");
b.Navigation("Car");
b.Navigation("User");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -1,17 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Data.Migrations
{
public partial class initial : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
}
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

View File

@@ -10,7 +10,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Data.Migrations namespace Data.Migrations
{ {
[DbContext(typeof(RentACarDbContext))] [DbContext(typeof(RentACarDbContext))]
[Migration("20220329101121_initial")] [Migration("20220401132719_initial")]
partial class initial partial class initial
{ {
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@@ -99,6 +99,9 @@ namespace Data.Migrations
b.Property<string>("FirstName") b.Property<string>("FirstName")
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
b.Property<bool>("IsAdmin")
.HasColumnType("bit");
b.Property<string>("LastName") b.Property<string>("LastName")
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");

View File

@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
namespace Data.Migrations namespace Data.Migrations
{ {
public partial class InitialMigration : Migration public partial class initial : Migration
{ {
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
{ {
@@ -72,6 +72,7 @@ namespace Data.Migrations
FirstName = table.Column<string>(type: "nvarchar(max)", nullable: true), FirstName = table.Column<string>(type: "nvarchar(max)", nullable: true),
LastName = table.Column<string>(type: "nvarchar(max)", nullable: true), LastName = table.Column<string>(type: "nvarchar(max)", nullable: true),
PersonalNumber = table.Column<string>(type: "nvarchar(max)", nullable: true), PersonalNumber = table.Column<string>(type: "nvarchar(max)", nullable: true),
IsAdmin = table.Column<bool>(type: "bit", nullable: false),
UserName = table.Column<string>(type: "nvarchar(450)", nullable: true), UserName = table.Column<string>(type: "nvarchar(450)", nullable: true),
NormalizedUserName = table.Column<string>(type: "nvarchar(max)", nullable: true), NormalizedUserName = table.Column<string>(type: "nvarchar(max)", nullable: true),
Email = table.Column<string>(type: "nvarchar(max)", nullable: true), Email = table.Column<string>(type: "nvarchar(max)", nullable: true),

View File

@@ -97,6 +97,9 @@ namespace Data.Migrations
b.Property<string>("FirstName") b.Property<string>("FirstName")
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
b.Property<bool>("IsAdmin")
.HasColumnType("bit");
b.Property<string>("LastName") b.Property<string>("LastName")
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");

View File

@@ -14,5 +14,7 @@ namespace Data.Entities
public string LastName { get; set; } public string LastName { get; set; }
public string PersonalNumber { get; set; } public string PersonalNumber { get; set; }
public bool IsAdmin { get; set; }
} }
} }

View File

@@ -14,9 +14,9 @@
<hr /> <hr />
<div asp-validation-summary="All" class="text-danger"></div> <div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group"> <div class="form-group">
<label asp-for="Input.Email"></label> <label asp-for="Input.Username"></label>
<input asp-for="Input.Email" class="form-control" /> <input asp-for="Input.Username" class="form-control" />
<span asp-validation-for="Input.Email" class="text-danger"></span> <span asp-validation-for="Input.Username" class="text-danger"></span>
</div> </div>
<div class="form-group"> <div class="form-group">
<label asp-for="Input.Password"></label> <label asp-for="Input.Password"></label>

View File

@@ -44,8 +44,7 @@ namespace WebApp.Areas.Identity.Pages.Account
public class InputModel public class InputModel
{ {
[Required] [Required]
[EmailAddress] public string Username { get; set; }
public string Email { get; set; }
[Required] [Required]
[DataType(DataType.Password)] [DataType(DataType.Password)]
@@ -82,7 +81,7 @@ namespace WebApp.Areas.Identity.Pages.Account
{ {
// This doesn't count login failures towards account lockout // This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true // To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false); var result = await _signInManager.PasswordSignInAsync(Input.Username, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded) if (result.Succeeded)
{ {
_logger.LogInformation("User logged in."); _logger.LogInformation("User logged in.");

View File

@@ -17,6 +17,36 @@
<input asp-for="Input.Email" class="form-control" /> <input asp-for="Input.Email" class="form-control" />
<span asp-validation-for="Input.Email" class="text-danger"></span> <span asp-validation-for="Input.Email" class="text-danger"></span>
</div> </div>
<div class="form-group">
<label asp-for="Input.FirstName"></label>
<input asp-for="Input.FirstName" class="form-control" />
<span asp-validation-for="Input.FirstName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.LastName"></label>
<input asp-for="Input.LastName" class="form-control" />
<span asp-validation-for="Input.LastName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.IsAdmin"></label>
<input asp-for="Input.IsAdmin" class="form-control" />
<span asp-validation-for="Input.IsAdmin" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.EGN"></label>
<input asp-for="Input.EGN" class="form-control" />
<span asp-validation-for="Input.EGN" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.PhoneNumber"></label>
<input asp-for="Input.PhoneNumber" class="form-control" />
<span asp-validation-for="Input.PhoneNumber" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.UserName"></label>
<input asp-for="Input.UserName" class="form-control" />
<span asp-validation-for="Input.UserName" class="text-danger"></span>
</div>
<div class="form-group"> <div class="form-group">
<label asp-for="Input.Password"></label> <label asp-for="Input.Password"></label>
<input asp-for="Input.Password" class="form-control" /> <input asp-for="Input.Password" class="form-control" />

View File

@@ -52,6 +52,25 @@ namespace WebApp.Areas.Identity.Pages.Account
[Display(Name = "Email")] [Display(Name = "Email")]
public string Email { get; set; } public string Email { get; set; }
[Required]
public string UserName { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
public bool IsAdmin { get; set; }
[Required]
[StringLength(10, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 10)]
public string EGN { get; set; }
[Required]
[DataType(DataType.PhoneNumber)]
[StringLength(10, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 10)]
public string PhoneNumber { get; set; }
[Required] [Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)] [DataType(DataType.Password)]
@@ -76,25 +95,23 @@ namespace WebApp.Areas.Identity.Pages.Account
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
var user = new User { UserName = Input.Email, Email = Input.Email }; var user = new User { Id = Guid.NewGuid().ToString(), UserName = Input.UserName, Email = Input.Email, FirstName = Input.FirstName, LastName = Input.LastName, PhoneNumber = Input.PhoneNumber, PersonalNumber = Input.EGN, IsAdmin = Input.IsAdmin};
var result = await _userManager.CreateAsync(user, Input.Password); var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded) if (result.Succeeded)
{ {
_logger.LogInformation("User created a new account with password."); _logger.LogInformation("User created a new account with password.");
await _signInManager.SignInAsync(user, isPersistent: false);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); if (Input.IsAdmin == true)
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); {
var callbackUrl = Url.Page( await _userManager.AddToRoleAsync(user, "Admin");
"/Account/ConfirmEmail", }
pageHandler: null, else
values: new { area = "Identity", userId = user.Id, code = code, returnUrl = returnUrl }, {
protocol: Request.Scheme); await _userManager.AddToRoleAsync(user, "User");
}
return LocalRedirect(returnUrl);
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
} }
foreach (var error in result.Errors) foreach (var error in result.Errors)
{ {
ModelState.AddModelError(string.Empty, error.Description); ModelState.AddModelError(string.Empty, error.Description);

View File

@@ -25,6 +25,11 @@ namespace API.Controllers
public IActionResult Privacy() public IActionResult Privacy()
{ {
if(!this.User.Identity.IsAuthenticated)
{
return Redirect("");
}
return View(); return View();
} }

View File

@@ -48,7 +48,7 @@ namespace API
} }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
{ {
if (env.IsDevelopment()) if (env.IsDevelopment())
{ {
@@ -68,7 +68,7 @@ namespace API
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();
CreateUserRoles(serviceProvider).Wait();
app.UseEndpoints(endpoints => app.UseEndpoints(endpoints =>
{ {
endpoints.MapControllerRoute( endpoints.MapControllerRoute(
@@ -77,5 +77,43 @@ namespace API
endpoints.MapRazorPages(); endpoints.MapRazorPages();
}); });
} }
private async System.Threading.Tasks.Task CreateUserRoles(IServiceProvider serviceProvider)
{
var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var UserManager = serviceProvider.GetRequiredService<UserManager<User>>();
string[] roleNames = { "Admin", "User"};
IdentityResult roleResult;
foreach (var roleName in roleNames)
{
var roleCheck = await RoleManager.RoleExistsAsync(roleName);
if (!roleCheck)
{
roleResult = await RoleManager.CreateAsync(new IdentityRole(roleName));
}
}
var user = new User();
user.UserName = "admin";
user.Id = Guid.NewGuid().ToString();
user.FirstName = "Admin";
user.LastName = "Admin";
user.PersonalNumber = "1234567890";
user.PhoneNumber = "0888888888";
user.Email = "admin@admin.admin";
user.IsAdmin = true;
string userPWD = "password";
var _user = await UserManager.FindByNameAsync(user.UserName);
if (_user == null)
{
IdentityResult chkUser = await UserManager.CreateAsync(user, userPWD);
if (chkUser.Succeeded)
{
await UserManager.AddToRoleAsync(user, "Admin");
}
}
}
} }
} }

View File

@@ -5,9 +5,11 @@
} }
<h1>Index</h1> <h1>Index</h1>
<p> <p>
<a asp-action="Create">New Car</a> @if (this.User.IsInRole("Admin"))
{
<a asp-action="Create">New car</a>
}
</p> </p>
<table class="table"> <table class="table">
<thead> <thead>
@@ -34,32 +36,33 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var item in Model) { @foreach (var item in Model)
<tr> {
<td> <tr>
@Html.DisplayFor(modelItem => item.Brand) <td>
</td> @Html.DisplayFor(modelItem => item.Brand)
<td> </td>
@Html.DisplayFor(modelItem => item.Model) <td>
</td> @Html.DisplayFor(modelItem => item.Model)
<td> </td>
@Html.DisplayFor(modelItem => item.Year) <td>
</td> @Html.DisplayFor(modelItem => item.Year)
<td> </td>
@Html.DisplayFor(modelItem => item.CountPassengerSeats) <td>
</td> @Html.DisplayFor(modelItem => item.CountPassengerSeats)
<td> </td>
@Html.DisplayFor(modelItem => item.Description) <td>
</td> @Html.DisplayFor(modelItem => item.Description)
<td> </td>
@Html.DisplayFor(modelItem => item.PriceForDay) <td>
</td> @Html.DisplayFor(modelItem => item.PriceForDay)
<td> </td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> | <td>
<a asp-action="Details" asp-route-id="@item.Id">Details</a> | <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a> <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
</td> <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</tr> </td>
} </tr>
}
</tbody> </tbody>
</table> </table>

View File

@@ -27,6 +27,15 @@
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Cars" asp-action="Index">Cars</a> <a class="nav-link text-dark" asp-area="" asp-controller="Cars" asp-action="Index">Cars</a>
</li> </li>
@if (this.User.IsInRole("Admin"))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Cars" asp-action="Create">Create Car</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Rents" asp-action="Index">Rents</a>
</li>
}
</ul> </ul>
<partial name="_LoginPartial" /> <partial name="_LoginPartial" />
</div> </div>