Tại @RenderBody(): tại đây dùng để hiển thị các bộ điều khiển của ta ra, có nghĩa là hiển thị nội dung mà bạn muốn, ví dụ bạn muốn fix header và footer cố định trang cho mỗi giao diện của website @RenderBody thì nó sẽ render cái nội dung của trang con ra ngoài trang layout
File ViewStart _ViewStart.cshtml: dùng để định nghĩa layout cho cả website, bạn có thể thiết lập tùy biến sài layout cũng được, giống như Admin thì sài layout này, cịn user thì thì sai layout kia. _ViewStart.cshtml: dùng để định nghĩa layout cho cả website, bạn có thể thiết lập tùy biến sài layout cũng được, giống như Admin thì sài layout này, cịn user thì thì sai layout kia.
Chúng ta thiết lập ViewBag.title dùng để chèn một chuổi dữ liệu hay một mảng dữ liệu mà ta muốn nó được hiện thị ngồi View, bạn có thể kết hợp với LingQ nhé, bạn có thể xem ví dụ dưới đây
//HomeController.cs var data = (from s in _db.users select s).ToList(); View.Bag = data; return View() //Views/Home/Index.cshtml @foreach(var result in ViewBag.data){ <span>@result.name</span> <span>@result.created_at> }
CÁC KIỂU TRUY VẤN ĐẾN ĐỐI TƯỢNG TRONG DB
Các Cú Pháp để truy vấn Entity Framework:
-
Dùng câu lệnh truy vấn 1 LIST: Namespace WebsiteBanHang.Controllers{ Public class HomeController : Controller { QuanLyBanHangEntities db = new QuanLyBanHangEntities(); Public ActionResult Index()
{
// Truy vấn lấy dữ liệu alf 1 danh sách KhachHang // Cách 1: Dùng câu lệnh truy vấn Var lstKH = from kh in db.KhachHangs select kh; Return View(lstKH);
// Cách 2: Dùng phương thức hỗ trợ sẵn truy vấn Var lstKH = db.KhachHangs.ToList(); Return View(lstKH); } }
-
}
Dùng câu lệnh truy vấn 1 ĐỐI TƯỢNG (THƯỜNG DÙNG LÀM LOGIN, LOGOUT,
GIỎ HÀNG, MÃ KH,… LÀ DUY NHẤT) : Namespace WebsiteBanHang.Controllers{ Public class HomeController : Controller { QuanLyBanHangEntities db = new QuanLyBanHangEntities(); Public ActionResult Index() { // Truy vấn lấy dữ liệu là 1 đối tượng KhachHang KHƠNG có điều kiện Where // Cách 1: Dùng câu lệnh truy vấn Var lstKH = from kh in db.KhachHangs select kh;
KhachHang khang = lstKH.FirstOrDefault<KhachHang>(); // Kiểu là nó sẽ lấy con đầu tiên của list, lấy con ở vị trí đầu tiên Return View(lstKH); // Cách 2: Dùng phương thức hỗ trợ sẵn truy vấn KhachHang khang = db.KhachHangs.Single(); Return View(); // Truy vấn lấy dữ liệu là 1 đối tượng KhachHang có điều kiện Where // Cách 1: Dùng câu lệnh truy vấn Var lstKH = from kh in db.KhachHangs where kh.MaKH==1 select kh; KhachHang khang = lstKH.FirstOrDefault<KhachHang>(); // Kiểu là nó sẽ lấy con đầu tiên của list, lấy con ở vị trí đầu tiên Return View(lstKH); // Cách 2: Dùng phương thức hỗ trợ sẵn truy vấn KhachHang khang = db.KhachHangs.SingleOrDefault(n=>n.MaKH==2); Return View(khang); public ActionResult TruyVan1DoiTuong() { //Cách 1 truy vấn 1 đối tượng bằng caua lệnh truy vấn //Bước 1 lấy ra danh sách khách hàng
var lstKH = from kh in db.KhachHang where kh.MaKH == 2 select kh; //Bước 2 láy đối tượng khách hàng dựa trên phương thức hỗ trợ KhachHang khang = db.KhachHang.SingleOrDefault(n=>n.MaKH==2); return View(khang);
}
// Truy vấn lấy dữ liệu là 1 đối tượng KhachHang được sắp xếp theo tên dùng phương thức public ActionResult SortDuLieu() { //Phương thức sắp xếp dữ liệu tăng dần List<KhachHang> lstKH = db.KhachHang.OrderBy(n => n.TenKH).ToList(); return View(lstKH); }
}
}
public ActionResult SortDuLieu2() { //Phương thức sắp xếp dữ liệu giảm dần List<KhachHang> lstKH = db.KhachHang.OrderByDescending(n => n.TenKH).ToList(); return View(lstKH);
}
} // Truy vấn lấy dữ liệu là GROUP Dữ liệu trên VIEW
-
Ở trong Bảng thành viên thì là sẽ các thành viên sử dụng hẹ thống phải đăng kí lúc đó sẽ có
mã loại thành viên link với kiểu loại thành vine vip hay là thường từ đó có thể chia ra đó là thành viên oke hay bth thì kiểu group qua VIEW ko qua controller Ở trong Controller thực hiện : public ActionResult GroupDulieutrenview() { List<ThanhVien> lstKH = db.ThanhVien.OrderByDescending(n => n.TaiKhoan).ToList(); return View(lstKH); } // Này là tạo ra một list để lấy tất cả các thành viên có trong bảnh thành viên í (bài này ko dùng bảng khách hàng ở trên) đó xong sau khi lấy xog hêt thành viên trong bảng thành viên thì thực hiện đẩy qua view
-
Ở trong View thực hiện : @using Realstore.Models; @model List<ThanhVien> @{
}
Layout = null; ViewBag.title = "GroupDulieu";
@foreach(var GroupLTV in Model.GroupBy(n=> n.MaLoaiTV)) { <div>@GroupLTV.Key</div>
foreach(var item in GroupLTV) {
@item.TaiKhoan
} } // Code này có gì code này sẽ lấy hàng từ controller đẩy lên và thực hiện vòng lặp foreach và thực hiện query, tạo 1 biến GROUPLTV từ trong đó và nhận giá trị mã loại // <div>@GroupLTV.Key</div> thì nó sẽ thực hiện in ra cái mã loại thành viên ‘’Key’’ ở đây tương ứng với Mã Loại thành viên (1 hoặc 2) // sau đó nó lại thực hiện, sau khi biết đc thanh viên loại nào, nó tiếp tục query xem loại tv đó có những ai và thực hiện tạo 1 biến item để moi trong cái bảng lúc nãy lấy hết giá trị của nó // Nó sẽ moi Loại thành viên 2 trc xong đó hết vịng, check lại xem còn loại tv nào ko rồi tiếp tục moi ai là người trong loai tv đó
-
Http GET thì là hàm trả lại view, cịn Post thì hàm xử lý chức năng nên là cái nào ra cái đấy nếu xử lý chức năng thì dùng post ko thì người dùng sẽ GET tự vào qua link
IEnumerable<SanPham> lstHTD = ViewBag.ListHTD as IEnumerable<SanPham>;
kiểu này thì giá trị trả về nó sẽ trả về là null nếu ko có cịn ở trên ko có thì sẽ bão lỗi
-
@foreach (var item in Model.Take(3)){} – dùng vòng lặp lấy 3 sản phẩm
-
Giả sử ở trong thông tin ở DB cần xuất ra chưa ký tự html thì chuyển ntn ?;
-
@Html.Raw(item.cauhinh) Ví dụ có 1 tên loại sản phẩm ở 1 bảng khác thì mà mình lại đang gọi 1 bảng khác thì chúng ta sử dụng cú pháp như sau
@Model.First().LoaiSanPham.TenLoai - Mới Nhất !
ơ khác bảng vẫn được à ?à ko . tới cái bảng có cái tên mình cần truy vấn rồi . cái trường tên đó ra là đk
Chèn link vô dùng cú pháp @Url.Action("Index","Home") với index là file chuyển đến home là controoler chứ file gửi
Cách lấy sản phẩm từ 1 bảng tới 1 bảng khác (kiểu lấy chuyền)
Bước 1 tách menu ra 1 view riêng rồi ghép qua cú pháp @html.Action(“tên file partial”,”tên controller chứa file đó”) Bước 2 <div class=" h_menu4"> <ul class="memenu skyblue"> <li class="active grid"><a class="color8" href="@Url.Action("Index","Home")">Trang
Chủ</a></li> @foreach (var groupItem in Model.GroupBy(n => n.LoaiSanPham)) // kiểu như là nó gom loại có bao nhiêu sản phẩm có loại sản phẩm đó rồi trả lại tên loại sản phẩm, nếu mà ko thì nó lại trả lại cùng nhiều loại sản phẩm // như kiểu là lọc trùng á, xong gom lại ra số loại sản phẩm thông qua sản phẩms { if (groupItem.Key != null) // kiểm tra xem sản phẩm nào có thuộc tính loại sản phẩm rồi thì lấy(ktra thơng qua tk loại sản phẩm) // khi mà group theo cái nào thì cái đó là key { <li> <a class="color1" href="#">@groupItem.Key.TenLoai</a> <div class="mepanel"> <div class="row"> <div class="col1"> <div class="h_nav"> <ul> <li><a href="products.html">Accessories</a></li> <li><a href="products.html">Bags</a></li> <li><a href="products.html">Caps & Hats</a></li> <li><a href="products.html">Hoodies & Sweatshirts</a></li> <li><a href="products.html">Jackets & Coats</a></li> <li><a href="products.html">Jeans</a></li> <li><a href="products.html">Jewellery</a></li> <li><a href="products.html">Jumpers & Cardigans</a></li> <li><a href="products.html">Leather Jackets</a></li> <li><a href="products.html">Long Sleeve T-Shirts</a></li> <li><a href="products.html">Loungewear</a></li> </ul>
</div> </div> </div> </div> </li> } } Nghĩa là trong cái bảng ấy thì mình dùng ….Key.”thuộc tính trong cái bảng đó để truy vấn trong bảng” cịn để mà nối 1 bảng khác thì ….GroupBy(n=>n.’Tên bảng’) và trong cái vịng foreach đó thì gọi thuộc tính ra lại dùng .Key -
Khi khai báo thấy tham số có dạng: ( int? id ) thì hiểu khai báo 1 biến tên id có kiểu int, dấu ? là int có thể 32bit hoặc 64bit
// Kiểm tra tham số truyền vào có rỗng hay khơng if (id == null) { return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest); } // nếu khơng thì truy xuất csdl lấy ra sản phẩm tương ứng SanPham sp = db.SanPham.SingleOrDefault(n => n.MaSP == id && n.DaXoa == false); if( sp == null) { //Thong báo nếu như khơng có sản phẩm đó return HttpNotFound(); }
-
Khi làm trang chi tiết nên chú ý:
Khi Trả về 1 sản phẩm: @using AuthStore.Models; @model SanPham
Khi trả về 1 list sản phẩm @using AuthStore.Models; @model IEnumerable<SanPham> @*nếu mà trả về 1 list các sản phẩm thì dùng kiểu irenumerable cịn ko thì để ngun 1 cái sanpham thơi*@
Làm việc với ROUTECONFIG.cs Tạo route mới thì nên bỏ trên default để tránh lỗi
1. Cấu Hình đường dẫn khơng có tham số: Ví dụ: routes.Map.Route( Name:”test”, // đây là tên của route url:”test”, // cịn đây là url nó sẽ hiển thị lên defaults: new { Controller = “testcontroller”, action=”testAction”, id = UrlParameter.Optional} // cịn đây là cái controller và action nó sẽ chạy ); Tại các view ta muốn tạo link liên kết đến action ta sử dụng Cú pháp: @html.RouteLink(“Click vào đay để vào trang khách hàng”,”tên của route”) 2. Cấu Hình đường dẫn có tham số: Ví dụ: routes.Map.Route( Name:”test”, // đây là tên của route
url:”{tensp}-{id}”, // cịn đây là url nó sẽ hiển thị lên, và có tham số id defaults: new { Controller = “testcontroller”, action=”testAction”, id = UrlParameter.Optional} // còn đây là cái controller và action nó sẽ chạy ); Tại các SanPhamController.cs Cú pháp: public ActionResult ChiTietSanPham(int? id,string tensp){ If(id == null){ Return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } SanPham sp = db.SanPhams.SingleOrDefault(n => n.MaSP == id);
If(sp == null){ Return HttpNotFound(); }
Return View(sp);
} Tại các view đổ ra màn hình thì (Sửa ở view SanPham, và partial1) Cũ: @Url.Action("XemChiTiet","SanPham", new { @id = item.MaSP}) Mới: @Url.RouteUrl("XemChiTiet", new{ @id = item.MaSP, @tensp = item.TenSP})
Khi Cập nhật thêm trường mới trong DB:
-
Vào model để thêm vào !!!
-
Làm trang đăng nhập đăng ký :
[HttpGet] là để load trong db ra trước khi trang đăng ký, vd load câu hỏi ra trước [HttpPost] là để dạng kiểu hành động sau khi bấm nút submit
Tạo Form và nhập thông tin đăng ký vào DB -
Đầu tiên là tạo 2 cái Action trong controller Home là đăng ký theo phương thức Post hoặc Get
Các cái trường Name trong các cái thẻ input là phải có cái name trùng với lại các trường trong bảng của SQL, bảng thành viên tương ứng ko là sẽ ko nhận đc giá trị. Ta có controller đăng ký Nhận vào [POST] có 2 kiểu nhận vào: CÁCH 1: [HttpPost] public ActionResult DangKy(ThanhVien tv) { db.ThanhVien.Add(tv); db.SaveChanges(); return View(); } Kiểu này thì ăn xổi nó sẽ add tất cả các thuộc tính của thẻ Form vơ theo đúng trong bảng db thông qua tv CÁCH 2: [HttpPost] public ActionResult DangKy(formCollection f) { String s = f[“HovaTen”].ToString(); return View(); } Kiểu này thì lấy từng giá trị 1 của form rất lâu và mất thời gian, càng nhiều trường code càng dài. -
Tiếp theo chúng ta sẽ cài cap cha vào form đăng ký:
+ Chuột phải vào tên project bấm Nupacket… + Chuyển qua mục Brower và tim captchamvc và cài MVC5 + Xong đó bấm buid PRJ để làm mới lại prj + Trong cái đăng ký html thì thêm 2 cái thư viện @using CaptchaMvc.HtmlHelpers
@using CaptchaMvc + Xong đó tắt prj xong đó mở lại + Xong đó tạo 1 cái div chứa capcha và thực hiện @html.Capcha(5) nhập 5 chữ bất kỳ mà ko trùng nhau @html.MathCapcha() Kiểu dạng trả lời toán học + Vào cái controller chưa action dăng ký thêm 2 thư viện Trên vào để làm check kết quả capcha nhập @using CaptchaMvc.HtmlHelpers @using CaptchaMvc + // kiểm tra capcha hợp lệ: If(this.IsCaptchaValid(“Captcha is not valid”)){ ViewBag.ThongBao = “Them thành cơng”; ko lỗi thì xuất ra cái này Return View(“”); // ở đây phải cho thêm cái add thông tin vào // vì đây là đúng nó sẽ chạy, nên nhập đúng mã captcha // thì code trong khung này sẽ chạy } ViewBag.ThongBao =Sai mã captcha””; // nếu mà lỗi thì xuất ra + thêm thẻ viewbag ở view để hiện thị lỗi ra:
@ViewBag.ThongBao
-
Tiếp theo chúng ta sẽ cài câu hỏi bảo mật vào form đăng ký:
-
Đầu tiên tạo 1 cái list action ở controlerr có action đk Public List<string> LoadCauHoi(){ List<string> lstCauHoi = new List<string>(); lstCauHoi.Add(“Con Vật mà bạn yêu thích”); lstCauHoi.Add(“ca sĩ mà bạn u thích”); lstCauHoi.Add(“Hiện tại bạn đang làm cơng việc gì”); return lstCauHoi; } Tiếp đến load câu hỏi ở 2 action đăng ký [GET] và[POST] [HTTP-GET] Public ActionResult DangKy(){ ViewBag.CauHoi = new SelectList(LoadCauHoi()); Return View(); } [HTTP-POST] public ActionResult DangKy(ThanhVien tv) { ViewBag.CauHoi = new SelectList(LoadCauHoi()); db.ThanhVien.Add(tv); db.SaveChanges(); return View(); } Tiếp tục sang view sửa thẻ input thành dropdownlist @html.DropDownList(“CauHoi”)
-
-
Chức năng đăng nhập trong web bán hàng: -
Đầu tiền gom con header top vào thành 1 cái partialview – HeaderTopPartial Xong đó tiếp tục tạo 1 cái controller là đăng nhập và kiểu trả về là public ActionResult DangNhap() { return RedirectToAction("Index");
-
}
-
Xong đó tiếp tục tạo trong cái thẻ form của đăng nhập để khi mình bấm đăng nhập thì nó sẽ chạy đến cái action đăng nhập của home và action đó sẽ trả mình về trang index. @using (Html.BeginForm("DangNhap", "Home")) {
<a href="../Registration/Registration.html">Khơng có tài khoản ?</a> -
}
Xong đó thực hiện thêm name của form trùng với name của action đăng nhập và thực hiện check pass vs db như sau
public ActionResult DangNhap(FormCollection f) { //kiem tra ten dang nhap va mạt khau string sTaiKhoan = f["txtTenDangNhap"].ToString(); string sMatKhau = f["txtMatKhau"].ToString(); ThanhVien tv = db.ThanhVien.SingleOrDefault(n => n.TaiKhoan == sTaiKhoan && n.MatKhau == sMatKhau); if (tv != null) // neu nhu bien thanh vien # rong ==> la co thanh vien do { Session["TaiKhoan"] = tv; return RedirectToAction("Index"); } return RedirectToAction("Index"); } Sau đó kiểm tra xem nếu đăng nhập rồi thì ẩn 2 nút đn đk, cịn ko thì chào khách @if (Session["TaiKhoan"] != null && Session["TaiKhoan"] != "") { //check xem khoi tao chua hay rong ThanhVien tv = (ThanhVien)Session["TaiKhoan"]; <li><a href="" class="">Chào @tv.HoTen </a></li> <li><a href="@Url.Action("DangXuat","Home")" class="">Đăng Xuất</a></li> } else { <li><a href="" class="btn">Đăng Nhập</a></li> <li><a href="@Url.Action("DangKy","Home")">Đăng Ký</a></li> }
Lưu Ý
Khi dùng để in ra 1 cái html action hoặc gì đấy thì ta dùng @Html.Action – Html.Actionlink Cịn nếu mà để chèn vào 1 đường link thông qua href thì dùng @Url.Action ko dùng @Html cho thẻ a href thì sẽ lỗi
Chức năng Validation form đăng nhập trong web bán hàng: Để thông báo đăng nhập đúng hay sai trong form thì sử dụng Ajax Ở View
@using (Ajax.BeginForm("DangNhap", "Home", new AjaxOptions{InsertionMode=InsertionMode.Replace,UpdateTargetId="ThongBao" })) {
<a href="../Registration/Registration.html">Khơng có tài khoản ?</a> } Thực hiện sửa form đăng nhập như trên theo Ajax Ở Controller
public ActionResult DangNhap(FormCollection f) { //kiem tra ten dang nhap va mạt khau string sTaiKhoan = f["txtTenDangNhap"].ToString(); string sMatKhau = f["txtMatKhau"].ToString(); ThanhVien tv = db.ThanhVien.SingleOrDefault(n => n.TaiKhoan == sTaiKhoan && n.MatKhau == sMatKhau); if (tv != null) // neu nhu bien thanh vien # rong ==> la co thanh vien do { Session["TaiKhoan"] = tv; return RedirectToAction("Index"); } return Content("Tài Khoản hoặc mật khẩu không đúng", "text/html"); } -
Thay đổi kiểu trả về của controller DangNhap (RedirectToAction) mà trả về kiểu Content
-
Nếu như mà nahpaj sai kết quả mà nó trả về 1 cái trang khác thì xem lại đã cài AJAX chưa, vào ajax cài jQuery unobtrusive ajax
Thực hiện sửa trong filw thanhvien.cs của model 1. Thêm thư viện using System.ComponentModel.DataAnnotations; 2. Thêm thư viện using System.ComponentModel; 3. Giả sử mà kiểu xây dựng trên view mà nta đã render sẵn ra rồi Thì sửa cái tên, trên tên cho cái như sau [DisplayName(“Mã Thành Viên”)] ở dưới thì mặc định là public int MaThanhVien{get, set;}. 4. Xong bắt đầu mình sẽ kiểm tra các thuộc tính hay chính là tham số đầuvào Bằng các cái thuộc tính có trong ảnh, muốn kiểm tra ở đâu thì chỉ cần Chèn phía trên vd [Required(ErrorMessage)=”{0} hãy nhập vào tài khoản”]
Tiếp tuc thực hiện thêm 1 số trường trong View:
Tiếp đến 1 trường hợp là nhập sai trong box nhưng mà nhập đúng capcha(Trong trang đăng ký) Thì thêm 1 dịng vào if(ModelState.IsValid) (Controller DangKy)
Chức năng Metadata để khi mà mình update
lại model thì cái mình validation trong model sẽ khơng bị mất: -
Ví dụ mình thêm 1 trường mới vào trong Db thì thêm xong +, Bấm Update, xong bấm Update database +, Tiếp tục cập nhật model, mở folder model ra và chuột Phải vào cái quanlybanhang.edmx +, Xong bấm update model form database xongn đó bấm Refesh xong tích vào table nhưng ko khuyến nghị +, nên xóa toàn bộ ở cái ở trong .edmx và bấn add tích table Thì hay hơn thành cơng nhiều hơn Cập nhật lại model thì có hiện tượng các cái validate bị mất Cách xử lý: tạo 1 metadata Cách tạo: +,Trong models tạo 1 cái folder Metadata +,Tạo 1 cái file class là thanhvien.cs +,Xong đó thêm vào thuộc tính như sau:
Đấy cover cái bảng nào sang metadata thì cứ làm giống copy nthe ở bảng gốc