public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddMvc();
services.AddTransient<IRepository, DataRepository>();
services.AddTransient<ICategoryRepository, CategoryRepository>();
string conString = Configuration["ConnectionStrings:DefaultConnection"];
services.AddDbContext<DataContext>(options =>
options.UseSqlServer(conString));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Categories}/{action=Index}/{id?}");
});
}
@model Category
<div class="row p-2">
<div class="col-1"></div>
<div class="col">
<input asp-for="Name" class="form-control" />
</div>
<div class="col">
<input asp-for="Description" class="form-control" />
</div>
<div class="col-3">
@if (Model.Id == 0)
{
<button type="submit" class="btn btn-primary">Add</button>
}
else
{
<button type="submit" class="btn btn-outline-primary">Save</button>
<a asp-action="Index" class="btn btn-outline-secondary">Cancel</a>
}
</div>
</div>
@model IEnumerable<Category>
<h3 class="p-2 bg-primary text-white text-center">Categories</h3>
<div class="container-fluid mt-3">
<div class="row">
<div class="col-1 font-weight-bold">Id</div>
<div class="col font-weight-bold">Name</div>
<div class="col font-weight-bold">Description</div>
<div class="col-3"></div>
</div>
@if (ViewBag.EditId == null)
{
<form asp-action="AddCategory" method="post">
@Html.Partial("CategoryEditor", new Category())
</form>
}
@foreach (Category c in Model)
{
@if (c.Id == ViewBag.EdiId)
{
<form asp-action="UpdateCategory" method="post">
<input type="hidden" name="Id" value="@c.Id" />
@Html.Partial("CategoryEditor", c)
</form>
}
else
{
<div class="row p-2">
<div class="col-1">@c.Id</div>
<div class="col">@c.Name</div>
<div class="col">@c.Description</div>
<div class="col-3">
<form asp-action="DeleteCategory" method="post">
<input type="hidden" name="Id" value="@c.Id" />
<a asp-action="EditCategory" asp-route-id="@c.Id" class="btn btn-outline-primary">Edit</a>
<button type="submit" class="btn btn-outline-danger">Delete</button>
</form>
</div>
</div>
}
}
</div>
public interface ICategoryRepository
{
IEnumerable<Category> Categories { get; }
void AddCategory(Category category);
void UpdateCategory(Category category);
void DeleteCategory(Category category);
}
public class CategoryRepository : ICategoryRepository
{
private DataContext context;
public CategoryRepository(DataContext ctx) => context = ctx;
public IEnumerable<Category> Categories => context.Categories;
public void AddCategory(Category category)
{
context.Categories.Add(category);
context.SaveChanges();
}
public void UpdateCategory(Category category)
{
context.Categories.Update(category);
context.SaveChanges();
}
public void DeleteCategory(Category category)
{
context.Categories.Remove(category);
context.SaveChanges();
}
}
public class CategoriesContoller : Controller
{
private ICategoryRepository repository;
public CategoriesContoller(ICategoryRepository repo)
{
repository = repo;
}
public IActionResult Index() => View(repository.Categories);
[HttpPost]
public IActionResult AddCategory(Category category)
{
repository.AddCategory(category);
return RedirectToAction(nameof(Index));
}
public IActionResult EditCategory(long id)
{
ViewBag.EditId = id;
return View("Index", repository.Categories);
}
[HttpPost]
public IActionResult UpdateCategory(Category category)
{
repository.UpdateCategory(category);
return RedirectToAction(nameof(Index));
}
[HttpPost]
public IActionResult DeleteCategory(Category category)
{
repository.DeleteCategory(category);
return RedirectToAction(nameof(Index));
}
}