BaseVM是WTM框架中的基礎VM,框架中所有內(nèi)置的VM都繼承自它,同時框架要求開發(fā)者自定義的VM也都要繼承它
BaseVM提供了連接Controller與View之間的,讓開發(fā)者編寫邏輯的地方。如果需要對數(shù)據(jù)進行增刪改查,導入導出等操作,請繼承更具體的VM建立一個VM
建立一個基礎的VM非常簡單,只需要繼承BaseVM就可以了,下面我們建立一個LoginVM來處理用戶登陸的操作
- using WalkingTec.Mvvm.Core;
- public class LoginVM : BaseVM{
- }
-
上面的代碼定義了一個LoginVM,它有什么用呢?
簡單來說,當你在Controller中通過CreateVM方法創(chuàng)建這個VM,框架會自動將編寫邏輯需要的很多數(shù)據(jù)傳遞給VM,比如當前登陸用戶的信息,表單提交的信息,當前數(shù)據(jù)庫連接等等
同時,VM里的屬性還可以用來綁定前臺頁面控件,這樣一個VM連接了前臺,后臺和數(shù)據(jù)庫,在VM里你可以訪問所有需要的信息來編寫你需要的邏輯
我們來完善一下LoginVM,來演示一個簡單的登陸操作
- using WalkingTec.Mvvm.Core;
- public class LoginVM : BaseVM{
- [Display(Name = "賬號")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(10)]
- public string Username { get; set; }
- [Display(Name = "密碼")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(10,ErrorMessage ="{0}最多輸入{1}個字符")]
- public string Password { get; set; }
- public LoginUserInfo DoLogin()
- {
- //根據(jù)用戶名和密碼查詢用戶
- var user = DC.Set()
- .Where(x => x.ITCode.ToLower() == ITCode.ToLower() && x.Password.ToLower() == Password.ToLower() && x.IsValid == true)
- .SingleOrDefault();
- //如果沒有找到則輸出錯誤
- if (user == null)
- {
- MSD.AddModelError("", "登錄失敗");
- }
- return user;
- }
- }
-
我們把登陸的全部邏輯封裝在了LoginVM中,這樣在Controller里,我們的代碼就非常簡單了
- using WalkingTec.Mvvm.Core;
- using WalkingTec.Mvvm.Mvc;
- [Public]
- public class LoginController : BaseController
- {
- [ActionDescription("登錄")]
- public IActionResult Login()
- {
- LoginVM vm = CreateVM();
- return View(vm);
- }
- [HttpPost]
- public ActionResult Login(LoginVM vm)
- {
- var user = vm.DoLogin();
- if (user == null)
- {
- return View(vm);
- }
- else
- {
- return Redirect("/home/index");
- }
- }
- }
-
BaseController是框架提供的Controller基類,所有應用框架的Controller都應該繼承這個類,詳見Controller部分的文檔
[Public],[ActionDescription]等屬性都是框架提供的應用于Controller和Action上的屬性,詳見Controller部分的文檔
在Controller中使用CreateVM來初始化VM,這樣做可以把當前請求的很多信息傳遞給VM,比如數(shù)據(jù)庫連接,Session等
簡單的單一字段驗證可以通過在屬性上加Attribute的方式來實現(xiàn)
復雜的驗證邏輯可以通過重寫B(tài)aseVM中的Validate方法來實現(xiàn)
下面的代碼演示了一個修改密碼的VM
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.Linq;
- using WalkingTec.Mvvm.Core;
- namespace WalkingTec.Mvvm.Demo.ViewModels.HomeVMs
- {
- public class ChangePasswordVM : BaseVM
- {
- [Display(Name = "用戶名")]
- public string ITCode { get; set; }
- [Display(Name = "當前密碼")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(50, ErrorMessage = "{0}最多輸入{1}個字符")]
- public string OldPassword { get; set; }
- [Display(Name = "新密碼")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(50, ErrorMessage = "{0}最多輸入{1}個字符")]
- public string NewPassword { get; set; }
- [Display(Name = "新密碼")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(50, ErrorMessage = "{0}最多輸入{1}個字符")]
- public string NewPasswordComfirm { get; set; }
- public override void Validate()
- {
- //檢查原密碼是否正確,如不正確則輸出錯誤
- if (DC.Set().Where(x => x.ITCode == LoginUserInfo.ITCode && x.Password == Utils.GetMD5String(OldPassword)).SingleOrDefault() == null){
- MSD.AddModelError("OldPassword", "當前密碼錯誤");
- }
- //檢查兩次新密碼是否輸入一致,如不一致則輸出錯誤
- if (NewPassword != NewPasswordComfirm)
- {
- MSD.AddModelError("NewPasswordComfirm", "兩次新密碼輸入不一致");
- }
- }
- public void DoChange()
- {
- var user = DC.Set().Where(x => x.ITCode == LoginUserInfo.ITCode).SingleOrDefault();
- if (user != null)
- {
- user.Password = Utils.GetMD5String(NewPassword);
- }
- DC.SaveChanges();
- }
- }
- }
-
重寫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等值
更多建議: