CRUD OPERATIONS IN REACT JS USING MVC CORE WEB API+SQL SERVER
1) download and install node.js in your computer
2) then open command prompt by pressing win+r afer that type npm i -g react and press enter
3) open visual studio
step 1: click on create new project
step 2: then click on ASP.NET Core Web Application and Click next button
step 3:then give a name to project and click on create button
step 4:then select react js and click on create button
now project is created shown below
step 6: create sql database and table so, open sql server management studio and create data base and table
step 7 : Now go to visual studio
Step 8: right click on project and then click on manage nuget packages
then install ..... 1) Microsoft.EntityFrameworkCore.SqlServer 2)Microsoft.EntityFrameworkCore.Tools
After you have installed both the packages, we will scaffold our model from the database tables using the following command shown in step 9.step 9: We are using Entity Framework core database first approach to create our models. Navigate to Tools >> NuGet Package Manager >> Package Manager Console.
Scaffold-DbContext "Data Source=DESKTOP-L3Q3AHO\SQLEXPRESS01;Initial Catalog=Employee;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
automatically when scaffold we have successfully created our Models using EF core database first approach.
Now,the Models folder will have the following structure.
Employeetbl.cs:
EmployeeContext.cs
Step 9:
Goto appsettings.json and add connection inside it,shown below.
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"connectionstrings": {
"sqlconnection": "Data Source=RAJESH\\SQLEXPRESS01;Initial Catalog=Employee;Integrated Security=True;"
},
"AllowedHosts": "*"
}
Step 10: Goto startup.cs and appsettings.json connectionstring inside it shown below.
services.AddDbContext<EmployeeContext>(options => options.UseSqlServer(Configuration.GetConnectionString("sqlconnection")));
Step 11: api controller
right click on
controllers folder and add
api controller and give a name to it with extention Controller
open it and add create action methods inside it.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Reactproject.Models;
namespace Reactproject.Controllers
{
[ApiController]
[Route("api/[controller]")]
//Employee Controller
public class EmployeesController : ControllerBase
{
private readonly EmployeeContext _context;
public EmployeesController(EmployeeContext context)
{
_context = context;
}
// get all employee data from data base
[Route("GetAllEmployees")]
[HttpGet]
public async Task<ActionResult<IEnumerable<Employeestbl>>> GetEmployees()
{
return await _context.Employeestbls.ToListAsync();
//var Name = "Rajesh";
//var product = _context.Employeestbls
// .FromSqlRaw("EXECUTE dbo.GetEmployee {0}", Name)
// .ToList();
//return product;
}
//get employee by id
[Route("GetEmployeebyid/{id}")]
[HttpGet]
public async Task<ActionResult<Employeestbl>> GetEmployee(int id)
{
var employeestbl = await _context.Employeestbls.FindAsync(id);
if (employeestbl == null)
{
return NotFound();
}
return employeestbl;
}
// update employee using id
[Route("UpdateEmployee/{id}")]
[HttpPut]
public object PutEmployeestbl(int id, Employeestbl employeestbl)
{
if (id != employeestbl.Id)
{
return BadRequest();
}
_context.Entry(employeestbl).State = EntityState.Modified;
try
{
_context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!EmployeestblExists(id))
{
return NotFound();
}
else
{
throw;
}
}
Responce obj = new Responce()
{
Status = "Success",
Message = "Updated Successfully"
};
return obj;
}
//add new employee to db table
[HttpPost]
[Route("PostEmployee")]
public object PostEmployee(Employeestbl employeestbl)
{
_context.Employeestbls.Add(employeestbl);
_context.SaveChangesAsync();
return new Responce
{
Status = "Success",
Message = "Data Successfully"
};
}
//delete employee based on id
[Route("DeleteEmployee/{id}")]
[HttpDelete]
public object DeleteEmployeestbl(int id)
{
var obj = _context.Employeestbls.Where(x => x.Id == id).ToList().FirstOrDefault();
if (obj == null)
{
return NotFound();
}
_context.Employeestbls.Remove(obj);
_context.SaveChanges();
return new Responce
{
Status = "Success",
Message = "Data Successfully"
};
}
private bool EmployeestblExists(int id)
{
return _context.Employeestbls.Any(e => e.Id == id);
}
}
}
step 12:
Open clientApp folder and add create Folders inside components folder
1)Employee
2)Services
and create http-common.js file and below code in it for base url of application
step 13: create employeeservices.js file inside Services folder
employeeservices.js :
import http from '../http-common'
class employeeservice {
getAll() {
debugger;
return http.get("/GetAllEmployees");
}
get(id) {
debugger;
return http.get(`/GetEmployeebyid/${id}`);
}
create(data) {
debugger;
return http.post("/PostEmployee", data);
}
update(id, data) {
debugger;
return http.put(`/UpdateEmployee/${id}`, data);
}
delete(id) {
debugger;
return http.delete(`/DeleteEmployee/${id}`);
}
deleteAll() {
return http.delete(`/Employees`);
}
}
export default new employeeservice();
step 14: open employee folder and create below .js files
addemployee.js:
import React from 'react';
import employeeservice from '../Services/employeeservice'
import { Container, Col, Form, FormGroup, Label, Input, Button } from 'reactstrap';
//email validation
const validEmailRegex = RegExp(/^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i);
const validateForm = errors => {
let valid = true;
Object.values(errors).forEach(val => val.length > 0 && (valid = false));
return valid;
};
class addemployee extends React.Component {
constructor(props) {
super(props)
this.state = {
id: '',
name: '',
mobilenumber: '',
email: '',
errors: {
nameError: '',
mobilenumberError: '',
emailError: ''
}
}
}
//validations
handleChange = (event) => {
debugger;
event.preventDefault();
this.setState({ [event.target.name]: event.target.value });
const { name, value } = event.target;
let errors = this.state.errors;
switch (name) {
case 'name':
errors.nameError =
value.length ==""
? ' Please enter name!'
: '';
break;
case 'email':
errors.emailError =
validEmailRegex.test(value)
? ''
: 'Email is not valid!';
break;
case 'mobilenumber':
errors.mobilenumberError =
value.length != 10
? 'Please enter 10 digit mobilenumber !'
: '';
break;
default:
}
this.setState({ errors, [name]: value });
}
//submit new employee
Addemployee = (event) => {
debugger;
event.preventDefault();
if (validateForm(this.state.errors)) {
console.info('Valid Form')
debugger;
employeeservice.create({
name: this.state.name, mobilenumber: this.state.mobilenumber,
email: this.state.email
}).then(json => {
if (json.data.status === 'Success') {
console.log(json.data.status);
alert("Data Save Successfully");
this.props.history.push('/listemployees')
}
else {
alert('Data not Saved');
debugger;
this.props.history.push('/listemployees')
}
})
}
else {
debugger;
console.log("invalid");
}
}
render() {
//disabled submit button when fields empty
const { name, mobilenumber, email } = this.state;
const isEnabled = name.length > 0 && mobilenumber.length > 0 && email.length > 0;
//html code
return (
<Container className="App">
<h4 className="PageHeading">Enter Student Informations</h4>
<Form className="form">
<Col>
<FormGroup row>
<Label for="Name" sm={2}>Name</Label>
<Col sm={10}>
<Input type="text" name="name" onChange={this.handleChange} value={this.state.name} placeholder="Enter Name" noValidate />
{this.state.errors.nameError.length > 0 && <span style={{ color: "red" }}>{this.state.errors.nameError}</span>}
</Col>
</FormGroup>
<FormGroup row>
<Label for="Mobilenumber" sm={2}>Mobilenumber</Label>
<Col sm={10}>
<Input type="number" name="mobilenumber" onChange={this.handleChange} value={this.state.mobilenumber} placeholder="Enter Mobilenumber" noValidate />
{this.state.errors.mobilenumberError.length > 0 && <span style={{ color: "red" }}>{this.state.errors.mobilenumberError}</span>}
</Col>
</FormGroup>
<FormGroup row>
<Label for="Email" sm={2}>Email</Label>
<Col sm={10}>
<Input type="text" name="email" onChange={this.handleChange} value={this.state.email} placeholder="Enter Email" noValidate />
{this.state.errors.emailError.length > 0 && <span style={{ color: "red" }}>{this.state.errors.emailError}</span>}
</Col>
</FormGroup>
</Col>
<Col>
<FormGroup row>
<Col sm={5}>
</Col>
<Col sm={1}>
<button type="button" disabled={!isEnabled} onClick={this.Addemployee} className="btn btn-success">Submit</button>
</Col>
<Col sm={1}>
<Button color="danger">Cancel</Button>{' '}
</Col>
<Col sm={5}>
</Col>
</FormGroup>
</Col>
</Form>
</Container>
);
}
}
employeedit.js:
import React from 'react';
import employeeservice from '../Services/employeeservice'
import { Container, Col, Form, FormGroup, Label, Input, Button } from 'reactstrap';
//email validation
const validEmailRegex = RegExp( /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i);
const validateForm = errors => {
let valid = true;
Object.values(errors).forEach(val => val.length > 0 && (valid = false));
return valid;
};
class employeedit extends React.Component {
constructor(props) {
super(props)
this.state = {
id: '',
name: '',
mobilenumber: '',
email: '',
errors: {
nameError: '',
mobilenumberError: '',
emailError: ''
}
}
}
//validations
handleChange = (event) => {
debugger;
event.preventDefault();
this.setState({[event.target.name]: event.target.value });
const { name, value } = event.target;
let errors = this.state.errors;
switch (name) {
case 'name':
errors.nameError =
value.length == ""
? ' Please enter name!'
: '';
break;
case 'email':
errors.emailError =
validEmailRegex.test(value)
? ''
: 'Email is not valid!';
break;
case 'mobilenumber':
errors.mobilenumberError =
value.length != 10
? 'Please enter 10 digit mobilenumber !'
: '';
break;
default:
}
this.setState({ errors, [name]: value });
}
// get the employee by id
//eg:https://localhost:44375/employee/1034
componentDidMount() {
this.getemployee(this.props.match.params.id);
}
getemployee(id) {
employeeservice.get(id)
.then(response => {
this.setState({
id: response.data.id,
name: response.data.name,
mobilenumber: response.data.mobilenumber,
email: response.data.email
});
})
.catch(e => {
console.log(e);
});
}
//update employee when click on submit button
updateemployee = (event) => {
event.preventDefault();
if (validateForm(this.state.errors)) {
console.info('Valid Form')
debugger;
employeeservice.update(this.state.id, this.state).then(json => {
if (json.data.status === 'Success') {
console.log(json.data.status);
alert("Data Updated Successfully");
this.props.history.push('/listemployees')
}
else {
alert('Data not Saved');
debugger;
this.props.history.push('/listemployees')
}
})
}
}
render() {
const { name, mobilenumber, email } = this.state;
const isEnabled = name.length > 0 && mobilenumber.length > 0 && email.length > 0;
//html code
return (
<Container className="App">
<h4 className="PageHeading">Enter Student Informations</h4>
<Form className="form">
<Col>
<FormGroup row>
<Label for="Name" sm={2}>Name</Label>
<Col sm={10}>
<Input type="text" name="name" onChange={this.handleChange} value={this.state.name} placeholder="Enter Name" noValidate />
{this.state.errors.nameError.length > 0 && <span style={{ color: "red" }}>{this.state.errors.nameError}</span>}
</Col>
</FormGroup>
<FormGroup row>
<Label for="Mobilenumber" sm={2}>Mobilenumber</Label>
<Col sm={10}>
<Input type="number" name="mobilenumber" onChange={this.handleChange} value={this.state.mobilenumber} placeholder="Enter Mobilenumber" noValidate />
{this.state.errors.mobilenumberError.length > 0 && <span style={{ color: "red" }}>{this.state.errors.mobilenumberError}</span>}
</Col>
</FormGroup>
<FormGroup row>
<Label for="Email" sm={2}>Email</Label>
<Col sm={10}>
<Input type="text" name="email" onChange={this.handleChange} value={this.state.email} placeholder="Enter Email" noValidate/>
{this.state.errors.emailError.length > 0 && <span style={{ color: "red" }}>{this.state.errors.emailError}</span>}
</Col>
</FormGroup>
</Col>
<Col>
<FormGroup row>
<Col sm={5}>
</Col>
<Col sm={1}>
<button type="button" disabled={!isEnabled} onClick={this.updateemployee} className="btn btn-success">Submit</button>
</Col>
<Col sm={1}>
<Button color="danger">Cancel</Button>{' '}
</Col>
<Col sm={5}>
</Col>
</FormGroup>
</Col>
</Form>
</Container>
);
}
}
export default employeedit;
listemployees.js:
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import employeeservice from '../Services/employeeservice'
class listemployees extends Component {
constructor(props) {
super(props);
this.state = { business: [], loading: true };
}
componentDidMount() {
this.componentemplist();
}
// to get employee list data
componentemplist() {
debugger;
employeeservice.getAll()
.then(response => {
this.setState({ business: response.data, loading: false });
debugger;
})
.catch(function (error) {
console.log(error);
})
}
//to delete employee
deleteemployee (id) {
debugger;
employeeservice.delete(id)
.then(json => {
if (json.data.status === 'Success') {
this.props.history.push('/addemployee')
alert('Record deleted successfully!!');
}
})
}
//html coding part
render() {
let contents = this.state.loading
? <p><em>Loading...</em></p>
: <table className='table table-striped' aria-labelledby="tabelLabel">
<thead>
<tr>
<th>ID</th>
<th>NAME</th>
<th>PHONE NUMBER</th>
<th>EMAIL ID</th>
<th colSpan="4">Action</th>
</tr>
</thead>
<tbody>
{this.state.business.map(employee =>
<tr key={employee.id}>
<td>{employee.id}</td>
<td>{employee.name}</td>
<td>{employee.mobilenumber}</td>
<td>{employee.email}</td>
<td>
<button className="btn btn-sm btn-danger btn-delete-user" onClick={() => this.deleteemployee(employee.id)}>Delete</button>
<Link to={"/employee/" + employee.id}
className="btn btn-sm btn-warning btn-delete-user" > Edit </Link>
</td>
</tr>
)}
</tbody>
</table>
return (
<div>
<h1 id="tabelLabel" >Employee list</h1>
{contents}
</div>
);
}
}
export default listemployees
step 15: app.js for routing and menu buttons
import React from 'react';
import addemployee from './components/Employee/addemployee';
import listemployees from './components/Employee/listemployees';
import employeedit from './components/Employee/employeedit';
import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom';
function App() {
return (
<Router>
<div className="container">
<nav className="navbar navbar-expand-lg navheader">
<div className="collapse navbar-collapse" >
<ul className="navbar-nav mr-auto">
<li className="nav-item">
<Link className="btn btn-success" to={'/addemployee'} >Add employee</Link>
</li>
<li className="nav-item">
<Link className="btn btn-success" to={'/listemployees'} >employee List</Link>
</li>
</ul>
</div>
</nav> <br />
<Switch>
<Route path="/employee/:id" component={employeedit} />
<Route path='/addemployee' component={addemployee} />
<Route path='/listemployees' component={listemployees} />
<Route path='/' component={addemployee} />
</Switch>
</div>
</Router>
);
}
export default App;
OUTPUT:
https://www.c-sharpcorner.com/article/crud-operations-using-web-api-and-reactjs/
https://bezkoder.com/react-crud-web-api/
https://www.c-sharpcorner.com/article/crud-operations-in-reactjs-with-axios-using-web-api-and-sql-server/
https://www.educative.io/edpresso/react-form-validation
Comments
Post a Comment