BaseVM是WTM框架中的基礎(chǔ)VM,框架中所有內(nèi)置的VM都繼承自它,同時(shí)框架要求開發(fā)者自定義的VM也都要繼承它
BaseVM提供了連接Controller與View之間的,讓開發(fā)者編寫邏輯的地方。如果需要對(duì)數(shù)據(jù)進(jìn)行增刪改查,導(dǎo)入導(dǎo)出等操作,請(qǐng)繼承更具體的VM建立一個(gè)VM
建立一個(gè)基礎(chǔ)的VM非常簡(jiǎn)單,只需要繼承BaseVM就可以了,下面我們建立一個(gè)LoginVM來(lái)處理用戶登陸的操作
- using WalkingTec.Mvvm.Core;
- public class LoginVM : BaseVM{
- }
-
上面的代碼定義了一個(gè)LoginVM,它有什么用呢?
簡(jiǎn)單來(lái)說(shuō),當(dāng)你在Controller中通過CreateVM方法創(chuàng)建這個(gè)VM,框架會(huì)自動(dòng)將編寫邏輯需要的很多數(shù)據(jù)傳遞給VM,比如當(dāng)前登陸用戶的信息,表單提交的信息,當(dāng)前數(shù)據(jù)庫(kù)連接等等
同時(shí),VM里的屬性還可以用來(lái)綁定前臺(tái)頁(yè)面控件,這樣一個(gè)VM連接了前臺(tái),后臺(tái)和數(shù)據(jù)庫(kù),在VM里你可以訪問所有需要的信息來(lái)編寫你需要的邏輯
我們來(lái)完善一下LoginVM,來(lái)演示一個(gè)簡(jiǎn)單的登陸操作
- using WalkingTec.Mvvm.Core;
- public class LoginVM : BaseVM{
- [Display(Name = "賬號(hào)")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(10)]
- public string Username { get; set; }
- [Display(Name = "密碼")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(10,ErrorMessage ="{0}最多輸入{1}個(gè)字符")]
- 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();
- //如果沒有找到則輸出錯(cuò)誤
- if (user == null)
- {
- MSD.AddModelError("", "登錄失敗");
- }
- return user;
- }
- }
-
我們把登陸的全部邏輯封裝在了LoginVM中,這樣在Controller里,我們的代碼就非常簡(jiǎn)單了
- 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基類,所有應(yīng)用框架的Controller都應(yīng)該繼承這個(gè)類,詳見Controller部分的文檔
[Public],[ActionDescription]等屬性都是框架提供的應(yīng)用于Controller和Action上的屬性,詳見Controller部分的文檔
在Controller中使用CreateVM來(lái)初始化VM,這樣做可以把當(dāng)前請(qǐng)求的很多信息傳遞給VM,比如數(shù)據(jù)庫(kù)連接,Session等
簡(jiǎn)單的單一字段驗(yàn)證可以通過在屬性上加Attribute的方式來(lái)實(shí)現(xiàn)
復(fù)雜的驗(yàn)證邏輯可以通過重寫B(tài)aseVM中的Validate方法來(lái)實(shí)現(xiàn)
下面的代碼演示了一個(gè)修改密碼的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 = "當(dāng)前密碼")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(50, ErrorMessage = "{0}最多輸入{1}個(gè)字符")]
- public string OldPassword { get; set; }
- [Display(Name = "新密碼")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(50, ErrorMessage = "{0}最多輸入{1}個(gè)字符")]
- public string NewPassword { get; set; }
- [Display(Name = "新密碼")]
- [Required(AllowEmptyStrings = false)]
- [StringLength(50, ErrorMessage = "{0}最多輸入{1}個(gè)字符")]
- public string NewPasswordComfirm { get; set; }
- public override void Validate()
- {
- //檢查原密碼是否正確,如不正確則輸出錯(cuò)誤
- if (DC.Set().Where(x => x.ITCode == LoginUserInfo.ITCode && x.Password == Utils.GetMD5String(OldPassword)).SingleOrDefault() == null){
- MSD.AddModelError("OldPassword", "當(dāng)前密碼錯(cuò)誤");
- }
- //檢查兩次新密碼是否輸入一致,如不一致則輸出錯(cuò)誤
- 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方法,進(jìn)行VM需要初始化的變量和操作,之所以要將初始化的代碼放到這里,是因?yàn)橹挥性贗nitVM和ReInitVM之后,VM中的DataContext,Session,ModelState等才有值
InitVM是在CreateVM時(shí)調(diào)用,ReInitVM是在Post回來(lái)時(shí)模型驗(yàn)證出錯(cuò)的時(shí)候調(diào)用,如果沒有重寫ReInitVM方法,則會(huì)默認(rèn)調(diào)用InitVM方法
當(dāng)手工通過new的方式建立vm時(shí),需要手動(dòng)調(diào)用InitVM和/或ReInitVM,并使用CopyContext方法從其他VM中復(fù)制DataContext,Session,ModelState等值
更多建議: