Web development

Implementation of Crud Operation and File Management in ASP.NET Core

Asp.Net Core is one of the leading Microsoft web frameworks having some magnificent features that help developers to build websites much quicker and easier. With the fine support of Windows Forms Designer tool in Asp.Net Core, it has become much stronger and helps you in building solid UIs with a rich look.

Many times, developers need to store the file on the server, and storing the physical file on the server is difficult because the server requires a lot of physical space. Thus let’s learn how to upload and download the file directly from the database in asp.net core.

Let’s Start With Example

Step 1: Create an application.

Open Visual Studio 2019.

Go to File manager ->project.

Create a new Asp.net Core Web Application project with the “DemoTest” name and click on the Create button.

Figure-1 Create an Application

Step 2: Select Template.

Select the web application (Model-View-Controller) template and click on the Create button.

Figure-2 Select template

Step 3: Set up the database

Open Server Explorer

Add Connection to the existing database.

Add “student” and “File” tables as follow.

Figure-3 Create student table
Figure-4 create a File table

Step 4: Create a Model

Right click on Model Folder->Click on Add option->Add class.

Add StudentModel and FileModel as follow:

StudentModel.cs

using System;

using System.ComponentModel.DataAnnotations;

namespace DemoTest.Models

{

public class StudentModel

{

[Key]

[Display(Name = “Student Unique-Id”)]

public int s_id { get; set; }

[Display(Name =”FirstName”)]

public string s_FirstName { get; set; }

[Display(Name = “LastName”)]

public string s_lastname { get; set; }

[Display(Name = “Enrollment Number”)]

public string s_EnrollmentNumber { get; set; }

[Display(Name = “Photo”)]

public string s_ProfilePic { get; set; }

[Display(Name = “Birthdate”)]

[DataType(DataType.Date)]

public DateTime s_Birthdate { get; set; }

}

}

FileModel.cs

using System.ComponentModel.DataAnnotations;

namespace DemoTest.Models

{

public class FileModel

{

[Key]

[Display(Name = “File Id”)]

public int Id { get; set; }

[Display(Name = “Name”)]

public string file_Name { get; set; }

 

[Display(Name = “File”)]

public string FilePath { get; set; }

 

}

}

 

Step 5: Add ApplicationDbContext class

Right-click on solution explorer->Go to NuGet Package Manager.

Install Microsoft.EntityFrameworkCore.SqlServer package.

Go to Model Folder->Add class with “ApplictionDbContext” name.

using Microsoft.EntityFrameworkCore;

namespace DemoTest.Models

{

public class ApplicationDbContext : DbContext

{

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)

{

 

}

public DbSet<StudentModel> student { get; set; }

public DbSet<FileModel> File { get; set; }

}

}

Step 6: Add Controller.

Go to Controller Folder->Add “StudentController” and “FileController”.

StudentController

using Microsoft.AspNetCore.Mvc;

using System.Linq;

using System.Threading.Tasks;

using Microsoft.AspNetCore.Http;

using Microsoft.AspNetCore.Hosting;

using DemoTest.Models;

using System.IO;

namespace DemoTest.Controllers

{

public class StudentController : Controller

{

private readonly ApplicationDbContext _dbContext;

private readonly IWebHostEnvironment _iWeb;

 

public StudentController(ApplicationDbContext dbContext, IWebHostEnvironment iWeb)

{

_dbContext = dbContext;

_iWeb = iWeb;

}

public IActionResult Index()

{

var student = _dbContext.student.ToList();

return View(student);

}

public IActionResult CreateStudent()

{

return View();

}

[HttpPost]

public async Task<IActionResult> CreateStudent(IFormFile s_ProfilePic, StudentModel s)

{

var imgEx = Path.GetExtension(s_ProfilePic.FileName);

if (imgEx == “.jpg” || imgEx == “.png”)

{

var uploadingPath = Path.Combine(_iWeb.WebRootPath, “Images”, s_ProfilePic.FileName);

var fileStream = new FileStream(uploadingPath, FileMode.Create);

await s_ProfilePic.CopyToAsync(fileStream);

fileStream.Close();

s.s_ProfilePic = s_ProfilePic.FileName;

}

await _dbContext.student.AddAsync(s);

await _dbContext.SaveChangesAsync();

return RedirectToAction(“Index”);

}

public IActionResult EditStudent(int id)

{

var studentDetail = _dbContext.student.Find(id);

return View(studentDetail);

}

[HttpPost]

public async Task<IActionResult> EditStudent(IFormFile s_ProfilePic, StudentModel s)

{

if(s_ProfilePic!=null)

{

var studentDetail = _dbContext.student.Find(s.s_id);

s.s_ProfilePic = studentDetail.s_ProfilePic;

var imgEx = Path.GetExtension(s_ProfilePic.FileName);

if (imgEx == “.jpg” || imgEx == “.png”)

{

var uploadingPath = Path.Combine(_iWeb.WebRootPath, “Images”, s_ProfilePic.FileName);

var fileStream = new FileStream(uploadingPath, FileMode.Create);

await s_ProfilePic.CopyToAsync(fileStream);

fileStream.Close();

s.s_ProfilePic = s_ProfilePic.FileName;

}

}

_dbContext.Update(s);

await _dbContext.SaveChangesAsync();

return RedirectToAction(“Index”);

}

public async Task<IActionResult> DetailStudent(int id)

{

var studentDetail = await _dbContext.student.FindAsync(id);

return View(studentDetail);

}

public async Task<IActionResult> DeleteStudent(int id)

{

var studentDetail = await _dbContext.student.FindAsync(id);

return View(studentDetail);

}

[HttpPost]

public async Task<IActionResult> DeleteStudent(int id,string fname)

{

var studentDetail = await _dbContext.student.FindAsync(id);

fname = Path.Combine(_iWeb.WebRootPath, “Images”, studentDetail.s_ProfilePic);

FileInfo fi = new FileInfo(fname);

if(fi.Exists)

{

System.IO.File.Delete(fname);

fi.Delete();

}

_dbContext.student.Remove(studentDetail);

await _dbContext.SaveChangesAsync();

return RedirectToAction(“Index”);

}

 

}

}

 

Note: For image .jpg and .png extension are required.

Create Image Folder inside www root folder.

In StudentController CreateStudent() method add student detail ,EditStudent() method edit Student detail, DetailStudent() method display detail of single student and DeleteStudent() method delete Student detail.

FileController

using Microsoft.AspNetCore.Mvc;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using Microsoft.AspNetCore.Http;

using Microsoft.AspNetCore.Hosting;

using DemoTest.Models;

using System.IO;

 

namespace DemoTest.Controllers

{

public class FileController : Controller

{

private readonly ApplicationDbContext _dbContext;

private readonly IWebHostEnvironment _iWeb;

 

public FileController(ApplicationDbContext dbContext, IWebHostEnvironment iWeb)

{

_dbContext = dbContext;

_iWeb = iWeb;

}

public IActionResult Index()

{

var file = _dbContext.File.ToList();

return View(file);

}

public IActionResult Upload()

{

return View();

}

[HttpPost]

public async Task<IActionResult> Upload(IFormFile file_Name,FileModel file)

{

if (file_Name != null || file_Name.Length != 0)

{

var path = Path.Combine(Directory.GetCurrentDirectory(), “wwwroot”, file_Name.FileName);

file.FilePath = path;

file.file_Name = file_Name.FileName;

using (var stream = new FileStream(path, FileMode.Create))

{

await file_Name.CopyToAsync(stream);

}

}

_dbContext.File.Add(file);

await _dbContext.SaveChangesAsync();

return RedirectToAction(“Index”);

}

public async Task<IActionResult> DownloadFile(string Name)

{

var path = Path.Combine(Directory.GetCurrentDirectory(),”wwwroot”,Name);

var memory = new MemoryStream();

using (var stream = new FileStream(path, FileMode.Open))

{

await stream.CopyToAsync(memory);

}

memory.Position = 0;

return File(memory, GetContentType(path), Path.GetFileName(path));

 

}

private string GetContentType(string path)

{

var types = GetMimeTypes();

var ext = Path.GetExtension(path).ToLowerInvariant();

return types[ext];

}

 

private Dictionary<string, string> GetMimeTypes()

{

return new Dictionary<string, string>

{

{“.txt”, “text/plain”},

{“.pdf”, “application/pdf”},

{“.doc”, “application/vnd.ms-word”},

{“.docx”, “application/vnd.ms-word”},

{“.xls”, “application/vnd.ms-excel”},

{“.xlsx”, “application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet”},

{“.png”, “image/png”},

{“.jpg”, “image/jpeg”},

{“.jpeg”, “image/jpeg”},

{“.gif”, “image/gif”},

{“.csv”, “text/csv”}

};

}

 

}

}

In File Controller, the Upload method is used to upload files, and the Download method is used to download the file.

Step 7: Add View

Right-click on View->Add view

Select Template based on the method.

Continue this process for each method of StudentController and FileContoller.

Figure-5 Add view

Note:  For uploading File or image method=”post” enctype=”multipart/form-data” must require in <form> tag in view page.

View of Upload () Method: Upload.cs

@model DemoTest.Models.FileModel

@{

ViewData[“Title”] = “Upload”;

}

<h1>Upload</h1>

<h4>FileModel</h4>

<hr />

<div class=”row”>

<div class=”col-md-4″>

<form asp-action=”Upload” method=”post” enctype=”multipart/form-data”>

<div asp-validation-summary=”ModelOnly” class=”text-danger”></div>

 

<div class=”form-group”>

<label asp-for=”file_Name” class=”control-label”></label>

<input asp-for=”file_Name” class=”form-control” type=”file”/>

<span asp-validation-for=”file_Name” class=”text-danger”></span>

</div>

<div class=”form-group”>

<input type=”submit” value=”Upload” class=”btn btn-primary” />

</div>

</form>

</div>

</div>

<div>

<a asp-action=”Index”>Back to List</a>

</div>

@section Scripts {

@{await Html.RenderPartialAsync(“_ValidationScriptsPartial”);}

}

Step 6: Configure Startup. cs file

Add Following libraries to Startup.class

using Microsoft.EntityFrameworkCore;

using DemoTest.Models;

using Microsoft.Extensions.FileProviders;

using System.IO;

Add DbContext in ConfigureServices method

public void ConfigureServices(IServiceCollection services)

{

services.AddControllersWithViews();

services.AddDbContext<ApplicationDbContext>(options =>

options.UseSqlServer(Configuration.GetConnectionString(“DatabaseConnection”)));

services.AddSingleton<IFileProvider>(

new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), “wwwroot”)));

 

}

Set Index method of StudentContoller as starting point of application in Configure () method.

app.UseEndpoints(endpoints =>

{

endpoints.MapControllerRoute(

name: “default”,

pattern: “{controller=Student}/{action=Index}/{id?}”);

});

Step 8: Build and Run project.

Figure-6 Index page of StudentController
Figure-7 Index page of FileController

Conclusion:

In this blog, we went through the topic of “how to perform crud operations like Insert, Update, Delete in Asp.Net Core”. Also discussed Upload and Download file and discuss an example of crud operation and upload/download in Asp.net Core application.

Author Bio: Ajay Patel – Technical Director, iFour Technolab Netherlands

A Seasoned technocrat with years of experience building technical solutions for various industries using Microsoft technologies. With sharp understanding and technical acumen, have delivered hundreds of Web, Cloud, Desktop and Mobile solutions and is heading the technical department at ASP.NET Core Software Company – iFour Technolab Netherlands.

Image:

LinkedIn: https://www.linkedin.com/in/ajay-patel-8406167a

Was this article helpful?
YesNo
Shankar

Shankar is a tech blogger who occasionally enjoys penning historical fiction. With over a thousand articles written on tech, business, finance, marketing, mobile, social media, cloud storage, software, and general topics, he has been creating material for the past eight years.

Recent Posts

From Standard Definition to Ultra-HD: The Streaming Journey So Far

It only seems like yesterday when people were ordering VHS, CDs, and DVDs from their… Read More

3 days ago

SEO vs. Paid Ads: Which is better for Our Businesses?

Large, small, and mid-sized businesses are continuously looking for better ways to improve their online… Read More

4 days ago

Strategies for Incorporating Wellness Programs in Rehab Marketing

Are you ready to transform lives? As a rehab marketer, you hold the power to… Read More

4 days ago

Key Applications of VLSI in Today’s Tech Industry

VLSI (Very Large Scale Integration) technology is at the core of modern electronics, enabling the… Read More

7 days ago

How to Align Your Financial Goals with the Best SIP Plan for Long-Term Returns?

Planning for the future can be challenging, but with the right strategy, you can steadily… Read More

1 week ago

The Role of Time Management in Overcoming Remote Work Distractions

Work distractions are estimated to cost U.S. businesses around $650 billion annually. Unlike in an… Read More

2 weeks ago