0
0

Add base crud actions for bundles

This commit is contained in:
Sergey Chebotar 2023-02-20 21:53:21 +03:00
parent c740669676
commit 3c83f9f4b0
11 changed files with 157 additions and 138 deletions

View File

@ -0,0 +1,110 @@
using System.Data;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using MyDarling.Models;
namespace MyDarling.Controllers
{
public class BundleController : Controller
{
private DataContext context;
public bool TryUpdateModel { get; private set; }
public BundleController(DataContext context)
{
this.context = context;
}
public ActionResult Index()
{
return View(context.UnderwearBundles.Include(b => b.Figures));
}
public ActionResult Create()
{
return View();
}
[HttpPost]
public async Task<ActionResult> Create([Bind] UnderwearBundle bundle)
{
try
{
if (ModelState.IsValid)
{
await context.UnderwearBundles.AddAsync(bundle);
context.SaveChanges();
return RedirectToAction(nameof(Index));
}
}
catch (DataException)
{
ModelState.AddModelError("", "Unable to save changes");
}
return View(bundle);
}
public async Task<ActionResult> Details(int id)
{
return View(await context.UnderwearBundles.FindAsync(id));
}
public async Task<ActionResult> Edit(int id)
{
return View(nameof(Details), await context.UnderwearBundles.FindAsync(id));
}
[HttpPost]
public async Task<ActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var bundle = await context.UnderwearBundles.FindAsync(id);
if (bundle == null)
{
return NotFound();
}
if (await TryUpdateModelAsync<UnderwearBundle>(
bundle,
"",
b => b.Name, b => b.Description, b => b.Price))
{
try
{
await context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
catch (System.Exception)
{
ModelState.AddModelError("", "Unable to save changes");
}
}
return View(bundle);
}
[HttpPost]
public async Task<ActionResult> Delete(int id)
{
var bundleToDelete = await context.UnderwearBundles.FindAsync(id);
if (bundleToDelete == null)
{
return NotFound();
}
try
{
context.UnderwearBundles.Remove(bundleToDelete);
await context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
catch(DbUpdateException)
{
return RedirectToAction(nameof(Delete), new {id = id, saveChangesError = true});
}
}
}
}

View File

@ -1,47 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using MyDarling.Models;
namespace MyDarling.Controllers
{
public class BundlesController : Controller
{
private IRepository repository;
public BundlesController(IRepository repository)
{
this.repository = repository;
}
public ActionResult Index()
{
return View(repository);
}
public ActionResult Edit(int id)
{
return View(repository.Bundles.Where(b => b.Id == id).FirstOrDefault());
}
public ActionResult Delete(int id)
{
var bundle = repository.Bundles.Where(b => b.Id == id).FirstOrDefault();
if (bundle != null)
{
repository.Remove(bundle);
}
return RedirectToAction("Index");
}
public ActionResult Add()
{
return View();
}
[HttpPost]
public ActionResult Add(UnderwearBundle b)
{
repository.Add(b);
return RedirectToAction("Index");
}
}
}

View File

@ -6,14 +6,14 @@ namespace MyDarling.Controllers
{ {
public class HomeController : Controller public class HomeController : Controller
{ {
private IRepository repository; private DataContext context;
public HomeController(IRepository repository) public HomeController(DataContext context)
{ {
this.repository = repository; this.context = context;
} }
public IActionResult Index() public IActionResult Index()
{ {
return View(repository); return View(context.UnderwearBundles.Include(b => b.Figures));
} }
} }
} }

View File

@ -1,10 +0,0 @@
namespace MyDarling.Models
{
public interface IRepository
{
public IQueryable<UnderwearBundle> Bundles { get; }
public void Add(UnderwearBundle b);
public void Remove(UnderwearBundle p);
public void Save();
}
}

View File

@ -1,32 +0,0 @@
using Microsoft.EntityFrameworkCore;
namespace MyDarling.Models
{
public class MyDarlingRepository : IRepository
{
private DataContext DbContext { get; }
public MyDarlingRepository(IServiceProvider provider)
{
DbContext = provider.CreateScope().ServiceProvider.GetRequiredService<DataContext>();
}
public IQueryable<UnderwearBundle> Bundles => DbContext.UnderwearBundles.Include(b => b.Figures);
public void Add(UnderwearBundle b)
{
DbContext.UnderwearBundles.Add(b);
DbContext.SaveChanges();
}
public void Remove(UnderwearBundle b)
{
DbContext.UnderwearBundles.Remove(b);
DbContext.SaveChanges();
}
public void Save()
{
DbContext.SaveChanges();
}
}
}

View File

@ -8,7 +8,7 @@ builder.Services.AddDbContext<DataContext>(opts =>
opts.UseSqlite(builder.Configuration["ConnectionStrings:MyDarlingDb"]); opts.UseSqlite(builder.Configuration["ConnectionStrings:MyDarlingDb"]);
opts.EnableSensitiveDataLogging(true); opts.EnableSensitiveDataLogging(true);
}); });
builder.Services.AddSingleton<IRepository, MyDarlingRepository>(); // builder.Services.AddSingleton<IRepository, MyDarlingRepository>();
builder.Services.AddControllersWithViews(); builder.Services.AddControllersWithViews();
var app = builder.Build(); var app = builder.Build();

View File

@ -11,7 +11,7 @@
<body> <body>
<container> <container>
<form asp-action="Add" method="post" class="m-2"> <form asp-action="Create" method="post" class="m-2">
<div asp-validation-summary="All"></div> <div asp-validation-summary="All"></div>
<div class="form-group"> <div class="form-group">
<label asp-for="Name" class="form-label">Name:</label> <label asp-for="Name" class="form-label">Name:</label>
@ -23,7 +23,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label asp-for="Price" class="form-label">Price:</label> <label asp-for="Price" class="form-label">Price:</label>
<input asp-for="Price" type="number" class="form-control" /> <input asp-for="Price" class="form-control" />
</div> </div>
<button type="submit" class="btn btn-primary mt-3">Submit</button> <button type="submit" class="btn btn-primary mt-3">Submit</button>
</form> </form>

View File

@ -0,0 +1,34 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model MyDarling.Models.UnderwearBundle
<!DOCTYPE html>
<html>
<head>
<title>Bundles list</title>
<link href="/lib/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<container>
<form asp-action="Edit" asp-route-id="@Model.Id" method="post" class="m-2">
<div asp-validation-summary="All"></div>
<div class="form-group">
<label asp-for="Name" class="form-label">Name:</label>
<input asp-for="Name" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Description" class="form-label">Descrition:</label>
@Html.TextAreaFor(model => model.Description, new { @class="form-control", @rows = 4 })
</div>
<div class="form-group">
<label asp-for="Price" class="form-label">Price:</label>
<input asp-for="Price" class="form-control" />
</div>
<button type="submit" class="btn btn-primary mt-3">Save</button>
<button asp-action="Delete" asp-route-id="@Model.Id" method="post" class="btn btn-primary mt-3">Delete</button>
</form>
</container>
</body>
</html>

View File

@ -1,5 +1,5 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model MyDarling.Models.IRepository @model IQueryable<MyDarling.Models.UnderwearBundle>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@ -18,23 +18,21 @@
<th scope="col">Name</th> <th scope="col">Name</th>
<th scope="col">Descrition</th> <th scope="col">Descrition</th>
<th scope="col">Price</th> <th scope="col">Price</th>
<th scope="col">Actions</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var bundle in Model.Bundles) @foreach (var bundle in Model)
{ {
<tr> <tr>
<th scope="row">@bundle.Id</th> <th scope="row">@bundle.Id</th>
<td><a asp-action="Edit" asp-route-id="@bundle.Id">@bundle.Name</a></td> <td><a asp-action="Details" asp-route-id="@bundle.Id">@bundle.Name</a></td>
<td>@bundle.Description</td> <td>@bundle.Description</td>
<td>@bundle.Price</td> <td>@bundle.Price</td>
<td><a asp-action="Delete" asp-route-id="@bundle.Id">Delete</a></td>
</tr> </tr>
} }
</tbody> </tbody>
</table> </table>
<a asp-action="Add">Add bundle</a> <a asp-action="Create">Add bundle</a>
</container> </container>
</body> </body>

View File

@ -1,34 +0,0 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<!DOCTYPE html>
<html>
<head>
<title>Bundles list</title>
<link href="/lib/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
<container>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Name</th>
<th scope="col">Descrition</th>
<th scope="col">Price</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">@Model.Id</th>
<td>@Model.Name</a></td>
<td>@Model.Description</td>
<td>@Model.Price</td>
</tr>
</tbody>
</table>
</container>
</body>
</html>

View File

@ -1,10 +1,10 @@
@model MyDarling.Models.IRepository; @model IQueryable<MyDarling.Models.UnderwearBundle>;
@using System.Globalization; @using System.Globalization;
<section class="projects-section bg-light" id="projects"> <section class="projects-section bg-light" id="projects">
<div class="container px-3 px-lg-4 mt-4"> <div class="container px-3 px-lg-4 mt-4">
<div class="row gx-4 gx-lg-5 row-cols-2 row-cols-md-3 row-cols-xl-4 justify-content-center"> <div class="row gx-4 gx-lg-5 row-cols-2 row-cols-md-3 row-cols-xl-4 justify-content-center">
@foreach (var bundle in @Model.Bundles.Where(b => b.Price != 0)) @foreach (var bundle in @Model.Where(b => b.Price != 0))
{ {
<div class="col mb-5"> <div class="col mb-5">
<div class="card h-100"> <div class="card h-100">