基礎VM

2019-04-04 17:40 更新

BaseVM是WTM框架中的基礎VM,框架中所有內(nèi)置的VM都繼承自它,同時框架要求開發(fā)者自定義的VM也都要繼承它


BaseVM提供了連接Controller與View之間的,讓開發(fā)者編寫邏輯的地方。如果需要對數(shù)據(jù)進行增刪改查,導入導出等操作,請繼承更具體的VM
建立一個VM

建立一個基礎的VM非常簡單,只需要繼承BaseVM就可以了,下面我們建立一個LoginVM來處理用戶登陸的操作

  1. using WalkingTec.Mvvm.Core;
  2. public class LoginVM : BaseVM{
  3. }

上面的代碼定義了一個LoginVM,它有什么用呢?

簡單來說,當你在Controller中通過CreateVM方法創(chuàng)建這個VM,框架會自動將編寫邏輯需要的很多數(shù)據(jù)傳遞給VM,比如當前登陸用戶的信息,表單提交的信息,當前數(shù)據(jù)庫連接等等

同時,VM里的屬性還可以用來綁定前臺頁面控件,這樣一個VM連接了前臺,后臺和數(shù)據(jù)庫,在VM里你可以訪問所有需要的信息來編寫你需要的邏輯

我們來完善一下LoginVM,來演示一個簡單的登陸操作

  1. using WalkingTec.Mvvm.Core;
  2. public class LoginVM : BaseVM{
  3. [Display(Name = "賬號")]
  4. [Required(AllowEmptyStrings = false)]
  5. [StringLength(10)]
  6. public string Username { get; set; }
  7. [Display(Name = "密碼")]
  8. [Required(AllowEmptyStrings = false)]
  9. [StringLength(10,ErrorMessage ="{0}最多輸入{1}個字符")]
  10. public string Password { get; set; }
  11. public LoginUserInfo DoLogin()
  12. {
  13. //根據(jù)用戶名和密碼查詢用戶
  14. var user = DC.Set()
  15. .Where(x => x.ITCode.ToLower() == ITCode.ToLower() && x.Password.ToLower() == Password.ToLower() && x.IsValid == true)
  16. .SingleOrDefault();
  17. //如果沒有找到則輸出錯誤
  18. if (user == null)
  19. {
  20. MSD.AddModelError("", "登錄失敗");
  21. }
  22. return user;
  23. }
  24. }
使用VM

我們把登陸的全部邏輯封裝在了LoginVM中,這樣在Controller里,我們的代碼就非常簡單了

  1. using WalkingTec.Mvvm.Core;
  2. using WalkingTec.Mvvm.Mvc;
  3. [Public]
  4. public class LoginController : BaseController
  5. {
  6. [ActionDescription("登錄")]
  7. public IActionResult Login()
  8. {
  9. LoginVM vm = CreateVM();
  10. return View(vm);
  11. }
  12. [HttpPost]
  13. public ActionResult Login(LoginVM vm)
  14. {
  15. var user = vm.DoLogin();
  16. if (user == null)
  17. {
  18. return View(vm);
  19. }
  20. else
  21. {
  22. return Redirect("/home/index");
  23. }
  24. }
  25. }
BaseController是框架提供的Controller基類,所有應用框架的Controller都應該繼承這個類,詳見Controller部分的文檔
[Public],[ActionDescription]等屬性都是框架提供的應用于Controller和Action上的屬性,詳見Controller部分的文檔
在Controller中使用CreateVM來初始化VM,這樣做可以把當前請求的很多信息傳遞給VM,比如數(shù)據(jù)庫連接,Session等
VM的自定義驗證

簡單的單一字段驗證可以通過在屬性上加Attribute的方式來實現(xiàn)

復雜的驗證邏輯可以通過重寫B(tài)aseVM中的Validate方法來實現(xiàn)

下面的代碼演示了一個修改密碼的VM

  1. using System.Collections.Generic;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.Linq;
  4. using WalkingTec.Mvvm.Core;
  5. namespace WalkingTec.Mvvm.Demo.ViewModels.HomeVMs
  6. {
  7. public class ChangePasswordVM : BaseVM
  8. {
  9. [Display(Name = "用戶名")]
  10. public string ITCode { get; set; }
  11. [Display(Name = "當前密碼")]
  12. [Required(AllowEmptyStrings = false)]
  13. [StringLength(50, ErrorMessage = "{0}最多輸入{1}個字符")]
  14. public string OldPassword { get; set; }
  15. [Display(Name = "新密碼")]
  16. [Required(AllowEmptyStrings = false)]
  17. [StringLength(50, ErrorMessage = "{0}最多輸入{1}個字符")]
  18. public string NewPassword { get; set; }
  19. [Display(Name = "新密碼")]
  20. [Required(AllowEmptyStrings = false)]
  21. [StringLength(50, ErrorMessage = "{0}最多輸入{1}個字符")]
  22. public string NewPasswordComfirm { get; set; }
  23. public override void Validate()
  24. {
  25. //檢查原密碼是否正確,如不正確則輸出錯誤
  26. if (DC.Set().Where(x => x.ITCode == LoginUserInfo.ITCode && x.Password == Utils.GetMD5String(OldPassword)).SingleOrDefault() == null){
  27. MSD.AddModelError("OldPassword", "當前密碼錯誤");
  28. }
  29. //檢查兩次新密碼是否輸入一致,如不一致則輸出錯誤
  30. if (NewPassword != NewPasswordComfirm)
  31. {
  32. MSD.AddModelError("NewPasswordComfirm", "兩次新密碼輸入不一致");
  33. }
  34. }
  35. public void DoChange()
  36. {
  37. var user = DC.Set().Where(x => x.ITCode == LoginUserInfo.ITCode).SingleOrDefault();
  38. if (user != null)
  39. {
  40. user.Password = Utils.GetMD5String(NewPassword);
  41. }
  42. DC.SaveChanges();
  43. }
  44. }
  45. }
VM的初始化

重寫VM中的InitVM和ReInitVM方法,進行VM需要初始化的變量和操作,之所以要將初始化的代碼放到這里,是因為只有在InitVM和ReInitVM之后,VM中的DataContext,Session,ModelState等才有值

InitVM是在CreateVM時調(diào)用,ReInitVM是在Post回來時模型驗證出錯的時候調(diào)用,如果沒有重寫ReInitVM方法,則會默認調(diào)用InitVM方法

當手工通過new的方式建立vm時,需要手動調(diào)用InitVM和/或ReInitVM,并使用CopyContext方法從其他VM中復制DataContext,Session,ModelState等值


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號