عملیات CRUD با استفاده از ADO.NET در MVC 5
دوشنبه 13 اردیبهشت 1395در این مقاله چگونگی انجام عملیات CRUD با بهره گیری از پایگاه داده را بررسی می کنیم. همچنین با مفاهیم موجود در MVC مانند View ، Model و ... نیز آشنا خواهیم شد.
مرحله 1 : ایجاد یک برنامه MVC
بیایید با یک روش گام به گام ، نوشتن برنامه را شروع کنیم . برای این کار مطابق دستور العمل های زیر عمل می کنیم :
1- بر روی start و سپس All Programs کلیک کرده و گزینه ی "Microsoft Visual Studio 2013" را انتخاب کنید.
2- از منوی File گزینه ی New و سپس Project را انتخاب کرده و در قسمت "ASP.NET Web Application Template" یک نام برای پروژه خودتان انتخاب کنید و بر روی OK کلیک نمایید . بعد از انجام این مراحل، پنجره زیر برای شما باز خواهد شد :

3-همان طور که در تصویر بالا می بینید بر روی Empty کلیک کرده و سپس گزینه MVC را انتخاب کنید و سپس بر روی OK کلیک کنید. این کار برای شما یک empty MVC web application ایجاد می کند که قسمت Solution Explorer آن مطابق زیر است :

مرحله 2 : یک Model Class ایجاد کنید.
حالا اجازه بدهید یک Model Class به نام EmpModel.cs ایجاد کنیم. برای این کار بر روی پوشه model کلیک راست می کنیم و مطابق تصویر زیر عمل می کنیم :

ایجاد کردن Model class در داخل پوشه ی Model اجباری نیست و فقط برای خوانا بودن برنامه و بخش بندی بهتر ، آن را در داخل پوشه ی جداگانه قرار دادیم.
تکه کد مربوط به کلاس EmpModel.cs به شکل زیر است :
public class EmpModel
{
[Display(Name = "Id")]
public int Empid { get; set; }
[Required(ErrorMessage = "First name is required.")]
public string Name { get; set; }
[Required(ErrorMessage = "City is required.")]
public string City { get; set; }
[Required(ErrorMessage = "Address is required.")]
public string Address { get; set; }
}
در کلاسmodel بالا ما تعدادی اعتبار سنجی نیز به کار بردیم.برای این کار از DataAnnotations کمک گرفته ایم.
مرحله 3 : یک Controller ایجاد کنید.
مطابق شکل زیر یک Controller به پروژه اضافه کنید :

بعد از کلیک بر روی دکمه ی Add ، پنجره زیر برای شما ظاهر خواهد شد . نام Employee را برای آن انتخاب کنید.

نکته : وجود پسوند 'Controller' برای نام آن ضروری است و این قسمت قابل حذف نیست.
بعد از کلیک کردن بر روی دکمه ی Add ، کنترلر ساخته می شود . این کنترلر به صورت پیش فرض شامل کدهایی است که از عملیات CRUD پشتیبانی می کند. در ادامه ی مقاله ما آن ها را مطابق با نیازهای خودمان تغییر می دهیم.
مرحله 4 : ایجاد جدول و Stored Procdure ها
قبل از این که view ها را ایجاد کنیم ، ابتدا باید یک جدول به نام Employee در پایگاه داده مطابق شکل زیر ایجاد کنیم :

حالا Stored Procedure هایی برای درج رکورد، نمایش ، به روز رسانی و حذف رکورد ایجاد می کنیم .
تکه کد های مربوط به این قسمت ها در زیر آورده شده اند :
برای درج رکورد
Create procedure [dbo].[AddNewEmpDetails] ( @Name varchar (50), @City varchar (50), @Address varchar (50) ) as begin Insert into Employee values(@Name,@City,@Address) End
برای مشاهده رکورد های اضافه شده
Create Procedure [dbo].[GetEmployees] as begin select *from Employee End
برای به روز رسانی رکورد ها
Create procedure [dbo].[UpdateEmpDetails] ( @EmpId int, @Name varchar (50), @City varchar (50), @Address varchar (50) ) as begin Update Employee set Name=@Name, City=@City, Address=@Address where Id=@EmpId End
برای حذف رکورد ها
Create procedure [dbo].[DeleteEmpById] ( @EmpId int ) as begin Delete from Employee where Id=@EmpId End
مرحله 5 : ایجاد یک کلاس Repository
حالا یک پوشه به نام Repository ایجاد کنید و کلاس EmpRepository.cs که مربوط به عملیات مرتبط با پایگاه داده است را به آن اضافه کنید. بعد از این مرحله، Solution explorer به صورت زیر خواهد بود :

متد هایی برای انجام عملیات CRUD به EmpRepository.cs اضافه می کنیم .
EmpRepository.cs
public class EmpRepository
{
private SqlConnection con;
//To Handle connection related activities
private void connection()
{
string constr = ConfigurationManager.ConnectionStrings["getconn"].ToString();
con = new SqlConnection(constr);
}
//To Add Employee details
public bool AddEmployee(EmpModel obj)
{
connection();
SqlCommand com = new SqlCommand("AddNewEmpDetails", con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue("@Name", obj.Name);
com.Parameters.AddWithValue("@City", obj.City);
com.Parameters.AddWithValue("@Address", obj.Address);
con.Open();
int i = com.ExecuteNonQuery();
con.Close();
if (i >= 1)
{
return true;
}
else
{
return false;
}
}
//To view employee details with generic list
public List<EmpModel> GetAllEmployees()
{
connection();
List<EmpModel> EmpList =new List<EmpModel>();
SqlCommand com = new SqlCommand("GetEmployees", con);
com.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(com);
DataTable dt = new DataTable();
con.Open();
da.Fill(dt);
con.Close();
//Bind EmpModel generic list using dataRow
foreach (DataRow dr in dt.Rows)
{
EmpList.Add(
new EmpModel {
Empid = Convert.ToInt32(dr["Id"]),
Name =Convert.ToString( dr["Name"]),
City = Convert.ToString( dr["City"]),
Address = Convert.ToString(dr["Address"])
}
);
}
return EmpList;
}
//To Update Employee details
public bool UpdateEmployee(EmpModel obj)
{
connection();
SqlCommand com = new SqlCommand("UpdateEmpDetails", con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue("@EmpId", obj.Empid);
com.Parameters.AddWithValue("@Name", obj.Name);
com.Parameters.AddWithValue("@City", obj.City);
com.Parameters.AddWithValue("@Address", obj.Address);
con.Open();
int i = com.ExecuteNonQuery();
con.Close();
if (i >= 1)
{
return true;
}
else
{
return false;
}
}
//To delete Employee details
public bool DeleteEmployee(int Id)
{
connection();
SqlCommand com = new SqlCommand("DeleteEmpById", con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue("@EmpId", Id);
con.Open();
int i = com.ExecuteNonQuery();
con.Close();
if (i >= 1)
{
return true;
}
else
{
return false;
}
}
}
مرحله 6 : ایجاد متد هایی در درون فایل EmployeeController.cs
متدهای زیر را به فایل EmployeeController.cs اضافه می کنیم :
public class EmployeeController : Controller
{
// GET: Employee/GetAllEmpDetails
public ActionResult GetAllEmpDetails()
{
EmpRepository EmpRepo = new EmpRepository();
ModelState.Clear();
return View(EmpRepo.GetAllEmployees());
}
// GET: Employee/AddEmployee
public ActionResult AddEmployee()
{
return View();
}
// POST: Employee/AddEmployee
[HttpPost]
public ActionResult AddEmployee(EmpModel Emp)
{
try
{
if (ModelState.IsValid)
{
EmpRepository EmpRepo = new EmpRepository();
if (EmpRepo.AddEmployee(Emp))
{
ViewBag.Message = "Employee details added successfully";
}
}
return View();
}
catch
{
return View();
}
}
// GET: Employee/EditEmpDetails/5
public ActionResult EditEmpDetails(int id)
{
EmpRepository EmpRepo = new EmpRepository();
return View(EmpRepo.GetAllEmployees().Find(Emp => Emp.Empid == id));
}
// POST: Employee/EditEmpDetails/5
[HttpPost]
public ActionResult EditEmpDetails(int id,EmpModel obj)
{
try
{
EmpRepository EmpRepo = new EmpRepository();
EmpRepo.UpdateEmployee(obj);
return RedirectToAction("GetAllEmpDetails");
}
catch
{
return View();
}
}
// GET: Employee/DeleteEmp/5
public ActionResult DeleteEmp(int id)
{
try
{
EmpRepository EmpRepo = new EmpRepository();
if (EmpRepo.DeleteEmployee(id))
{
ViewBag.AlertMsg = "Employee details deleted successfully";
}
return RedirectToAction("GetAllEmpDetails");
}
catch
{
return View();
}
}
}
مرحله 7 : ایجاد View ها
ایجاد یک Partial view برای افزودن افراد جدید
برای ایجاد یک Partial View برای افرودن افراد جدید، بر روی متد ActionResult کلیک راست کرده و سپس بر روی view کلیک کنید. یک نام برایview ، یک نام برای template و همچنین model class مورد نظرتان را انتخاب کرده و سپس بر روی دکمه Add کلیک کنید. از عکس زیر برای این مرحله کمک بگیرید :

بعد از کلیک بر روی دکمه ی Add ، برنامه برای شما یک view از نوع strongly typed ایجاد می کند که کد آن مانند زیر است :
AddEmployee.cshtml
@model CRUDUsingMVC.Models.EmpModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Add Employee</h4>
<div>
@Html.ActionLink("Back to Employee List", "GetAllEmpDetails")
</div>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.City, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.City, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.City, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Address, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10" style="color:green">
@ViewBag.Message
</div>
</div>
</div>
}
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
برای نمایش اعضای اضافه شده
برای مشاهده جزئیات هر کارمند یک partial view ایجاد می کنیم به نام GetAllEmpDetails .

بر روی دکمه ی Add کلیک کنید . برای شما یک strongly typed view ایجاد می شود که کد آن مطابق زیر است :
GetAllEmpDetails.CsHtml
@model IEnumerable<CRUDUsingMVC.Models.EmpModel>
<p>
@Html.ActionLink("Add New Employee", "AddEmployee")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.City)
</th>
<th>
@Html.DisplayNameFor(model => model.Address)
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
@Html.HiddenFor(model => item.Empid)
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.City)
</td>
<td>
@Html.DisplayFor(modelItem => item.Address)
</td>
<td>
@Html.ActionLink("Edit", "EditEmpDetails", new { id = item.Empid }) |
@Html.ActionLink("Delete", "DeleteEmp", new { id = item.Empid }, new { onclick = "return confirm('Are sure wants to delete?');" })
</td>
</tr>
}
</table>
برای به روز رسانی کارمند های افزوده شده
از یک Procedure مشابه استفاده می کنیم و یک view به نام EditEmpDetails برای ویرایش کارمندان ایجاد می کنیم . بعد از ایجاد کردن view ، کد مطابق شکل زیر می شود :
EditEmpDetails.cshtml
@model CRUDUsingMVC.Models.EmpModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Update Employee Details</h4>
<hr />
<div>
@Html.ActionLink("Back to Details", "GetAllEmployees")
</div>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.Empid)
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.City, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.City, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.City, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Address, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Update" class="btn btn-default" />
</div>
</div>
</div>
}
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
مرحله 8 : Action Link را مطابق شکل زیر پیکر بندی کنید تا بتواند داده ها را ویرایش و حذف کند.

من Action Link بالا را در GetAllEmpDetails.CsHtml اضافه کرده ام زیرا به روز رسانی و حذف داده ها از آن قسمت باید انجام بگیرند.
مرحله 9 : RouteConfig.cs را طوری پیکر بندی کنید که action پیش فرض را برای خودش تنظیم کند. برای این کار از کد زیر استفاده کنید:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Employee", action = "AddEmployee", id = UrlParameter.Optional }
);
}
}
مطابق RouteConfig.cs بالا، متدی که ما به عنوان پیش فرض انتخاب کرده ایم ، AddEmployee است. این کار به این معنی است که بعد از اجرای برنامه ، AddEmployee ، اولین view ای است که اجرا می شود.
حالا بعد از اضافه کردن همه اجزا ،Solution explorer ما به صورت زیر به نظر خواهد رسید:

مرحله 10 : اجرای برنامه
حالا برنامه را اجرا کنید . مطابق شکل زیر AddEmployee view برای شما ظاهر خواهد شد :

اگر بدون وارد کردن اطلاعات ، بر روی دکمه Save کلیک کنیم، مطابق شکل زیر خطاهایی ظاهر خواهند شد :

حالا جزئیات مورد نظر خودتان را وارد کنید و بر روی دکمه ی ذخیره اطلاعات کلیک کنید، رکورد های در پایگاه داده درج خواهند شد و پیام زیر برای شما ظاهر خواهد شد:

حالا گزینه ی "بازگشت به لیست کارمندان " را بزنید. این کار شما را به صفحه ی جزئیات کارمندان هدایت خواهد کرد.

اگر بر روی دکمه ویرایش کلیک کنید، به صفحه ای هدایت خواهید شد که در آن قادر خواهید بود اطلاعات کارمند را تغییر بدهید.

و همه ی تغییراتی که در این بخش اعمال کنید بر روی پایگاه داده و همچنین جزئیات کارمندان اعمال خواهد شد.

به این ترتیب مرحله به مرحله ، یک برنامه ی ASP.Net MVC ساختیم که عملیات CRUD را برای ما انجام می دهد.
نکات پایانی :
database connection موجود در بخش web.config را مطابق تنظیمات database server خودتان تغییر بدهید.
برای فهم بهتر مطالب ، فایل فشرده ای که همراه مقاله وجود دارد را دانلود کنید.
- ASP.net MVC
- 2k بازدید
- 4 تشکر