Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Tom FitzMacken
Seri tutorial ini menunjukkan aspek dasar penggunaan pengikatan model dengan proyek ASP.NET Web Forms. Pengikatan model membuat interaksi data lebih lurus ke depan daripada berurusan dengan objek sumber data (seperti ObjectDataSource atau SqlDataSource). Seri ini dimulai dengan materi pengantar dan beralih ke konsep yang lebih canggih dalam tutorial selanjutnya.
Tutorial ini menunjukkan cara menggunakan pengikatan model dengan lapisan logika bisnis. Anda akan mengatur anggota OnCallingDataMethods untuk menentukan bahwa objek selain halaman saat ini digunakan untuk memanggil metode data.
Tutorial ini dibangun pada proyek yang dibuat di bagian sebelumnya dari seri.
Anda dapat mengunduh proyek lengkap di C# atau VB. Kode yang dapat diunduh berfungsi dengan Visual Studio 2012 atau Visual Studio 2013. Ini menggunakan templat Visual Studio 2012, yang sedikit berbeda dari templat Visual Studio 2013 yang ditunjukkan dalam tutorial ini.
Apa yang akan Anda bangun
Pengikatan model memungkinkan Anda menempatkan kode interaksi data anda di file code-behind untuk halaman web atau di kelas logika bisnis terpisah. Tutorial sebelumnya telah menunjukkan cara menggunakan file code-behind untuk kode interaksi data. Pendekatan ini berfungsi untuk situs kecil tetapi dapat menyebabkan pengulangan kode dan kesulitan yang lebih besar ketika mempertahankan situs besar. Mungkin juga sangat sulit untuk menguji kode secara terprogram yang berada dalam kode di belakang file karena tidak ada lapisan abstraksi.
Untuk mempusatkan kode interaksi data, Anda dapat membuat lapisan logika bisnis yang berisi semua logika untuk berinteraksi dengan data. Anda kemudian memanggil lapisan logika bisnis dari halaman web Anda. Tutorial ini menunjukkan cara memindahkan semua kode yang telah Anda tulis dalam tutorial sebelumnya ke lapisan logika bisnis, lalu menggunakan kode tersebut dari halaman.
Dialam tutorial ini, Anda akan:
- Memindahkan kode dari file code-behind ke lapisan logika bisnis
- Mengubah kontrol terikat data Anda untuk memanggil metode di lapisan logika bisnis
Membuat lapisan logika bisnis
Sekarang, Anda akan membuat kelas yang dipanggil dari halaman web. Metode di kelas ini terlihat mirip dengan metode yang Anda gunakan dalam tutorial sebelumnya dan menyertakan atribut penyedia nilai.
Pertama, tambahkan folder baru bernama BLL.
Di folder BLL, buat kelas baru bernama SchoolBL.cs. Ini akan berisi semua operasi data yang awalnya berada di file code-behind. Metodenya hampir sama dengan metode dalam file code-behind, tetapi akan menyertakan beberapa perubahan.
Perubahan terpenting yang perlu diperhatikan adalah Anda tidak lagi mengeksekusi kode dari dalam instans kelas Halaman . Kelas Halaman berisi metode TryUpdateModel dan properti ModelState . Ketika kode ini dipindahkan ke lapisan logika bisnis, Anda tidak lagi memiliki instans kelas Halaman untuk memanggil anggota ini. Untuk mengatasi masalah ini, Anda harus menambahkan parameter ModelMethodContext ke metode apa pun yang mengakses TryUpdateModel atau ModelState. Anda menggunakan parameter ModelMethodContext ini untuk memanggil TryUpdateModel atau mengambil ModelState. Anda tidak perlu mengubah apa pun di halaman web untuk mempertanyakan parameter baru ini.
Ganti kode di SchoolBL.cs dengan kode berikut.
using System;
using System.Linq;
using ContosoUniversityModelBinding.Models;
using System.Web.ModelBinding;
using System.Web.UI.WebControls;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
namespace ContosoUniversityModelBinding.BLL
{
public class SchoolBL : IDisposable
{
SchoolContext db = new SchoolContext();
public IQueryable<Student> GetStudents([Control] AcademicYear? displayYear)
{
var query = db.Students.Include(s => s.Enrollments.Select(e => e.Course));
if (displayYear != null)
{
query = query.Where(s => s.Year == displayYear);
}
return query;
}
public void InsertStudent(ModelMethodContext context)
{
var item = new Student();
context.TryUpdateModel(item);
if (context.ModelState.IsValid)
{
db.Students.Add(item);
db.SaveChanges();
}
}
public void DeleteStudent(int studentID, ModelMethodContext context)
{
var item = new Student { StudentID = studentID };
db.Entry(item).State = EntityState.Deleted;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
context.ModelState.AddModelError("",
String.Format("Item with id {0} no longer exists in the database.", studentID));
}
}
public void UpdateStudent(int studentID, ModelMethodContext context)
{
Student item = null;
item = db.Students.Find(studentID);
if (item == null)
{
context.ModelState.AddModelError("", String.Format("Item with id {0} was not found", studentID));
return;
}
context.TryUpdateModel(item);
if (context.ModelState.IsValid)
{
db.SaveChanges();
}
}
public IQueryable<Enrollment> GetCourses([QueryString] int? studentID)
{
var query = db.Enrollments.Include(e => e.Course)
.Where(e => e.StudentID == studentID);
return query;
}
private bool disposedValue = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposedValue)
{
if (disposing)
{
db.Dispose();
}
}
this.disposedValue = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
Merevisi halaman yang ada untuk mengambil data dari lapisan logika bisnis
Terakhir, Anda akan mengonversi halaman Students.aspx, AddStudent.aspx, dan Courses.aspx dari menggunakan kueri dalam file code-behind menjadi menggunakan lapisan logika bisnis.
Dalam file code-behind untuk Siswa, AddStudent, dan Kursus, hapus atau komentari metode kueri berikut:
- studentsGrid_GetData
- studentsGrid_UpdateItem
- studentsGrid_DeleteItem
- addStudentForm_InsertItem
- coursesGrid_GetData
Anda sekarang seharusnya tidak memiliki kode dalam file code-behind yang berkaitan dengan operasi data.
Penanganan aktivitas OnCallingDataMethods memungkinkan Anda menentukan objek yang akan digunakan untuk metode data. Di Students.aspx, tambahkan nilai untuk penanganan aktivitas tersebut dan ubah nama metode data menjadi nama metode di kelas logika bisnis.
<asp:GridView runat="server" ID="studentsGrid"
ItemType="ContosoUniversityModelBinding.Models.Student" DataKeyNames="StudentID"
SelectMethod="GetStudents"
UpdateMethod="UpdateStudent" DeleteMethod="DeleteStudent"
AllowSorting="true" AllowPaging="true" PageSize="4"
AutoGenerateEditButton="true" AutoGenerateDeleteButton="true"
AutoGenerateColumns="false"
OnCallingDataMethods="studentsGrid_CallingDataMethods">
Dalam file code-behind untuk Students.aspx, tentukan penanganan aktivitas untuk peristiwa CallingDataMethods. Dalam penanganan aktivitas ini, Anda menentukan kelas logika bisnis untuk operasi data.
protected void studentsGrid_CallingDataMethods(object sender, CallingDataMethodsEventArgs e)
{
e.DataMethodsObject = new ContosoUniversityModelBinding.BLL.SchoolBL();
}
Di AddStudent.aspx, buat perubahan serupa.
<asp:FormView runat="server" ID="addStudentForm"
ItemType="ContosoUniversityModelBinding.Models.Student"
InsertMethod="InsertStudent" DefaultMode="Insert"
OnCallingDataMethods="addStudentForm_CallingDataMethods"
RenderOuterTable="false" OnItemInserted="addStudentForm_ItemInserted">
protected void addStudentForm_CallingDataMethods(object sender, CallingDataMethodsEventArgs e)
{
e.DataMethodsObject = new ContosoUniversityModelBinding.BLL.SchoolBL();
}
Di Courses.aspx, buat perubahan serupa.
<asp:GridView runat="server" ID="coursesGrid"
ItemType="ContosoUniversityModelBinding.Models.Enrollment"
SelectMethod="GetCourses" AutoGenerateColumns="false"
OnCallingDataMethods="coursesGrid_CallingDataMethods">
protected void coursesGrid_CallingDataMethods(object sender, CallingDataMethodsEventArgs e)
{
e.DataMethodsObject = new ContosoUniversityModelBinding.BLL.SchoolBL();
}
Jalankan aplikasi dan perhatikan bahwa semua halaman berfungsi seperti sebelumnya. Logika validasi juga berfungsi dengan benar.
Kesimpulan
Dalam tutorial ini, Anda menyusun ulang aplikasi Anda untuk menggunakan lapisan akses data dan lapisan logika bisnis. Anda menentukan bahwa kontrol data menggunakan objek yang bukan halaman saat ini untuk operasi data.