基础VM

2019-04-04 17:40 更新

BaseVM是WTM框架中的基础VM,框架中所有内置的VM都继承自它,同时框架要求开发者自定义的VM也都要继承它


BaseVM提供了连接Controller与View之间的,让开发者编写逻辑的地方。如果需要对数据进行增删改查,导入导出等操作,请继承更具体的VM
建立一个VM

建立一个基础的VM非常简单,只需要继承BaseVM就可以了,下面我们建立一个LoginVM来处理用户登陆的操作

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

上面的代码定义了一个LoginVM,它有什么用呢?

简单来说,当你在Controller中通过CreateVM方法创建这个VM,框架会自动将编写逻辑需要的很多数据传递给VM,比如当前登陆用户的信息,表单提交的信息,当前数据库连接等等

同时,VM里的属性还可以用来绑定前台页面控件,这样一个VM连接了前台,后台和数据库,在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. //根据用户名和密码查询用户
  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,比如数据库连接,Session等
VM的自定义验证

简单的单一字段验证可以通过在属性上加Attribute的方式来实现

复杂的验证逻辑可以通过重写BaseVM中的Validate方法来实现

下面的代码演示了一个修改密码的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时调用,ReInitVM是在Post回来时模型验证出错的时候调用,如果没有重写ReInitVM方法,则会默认调用InitVM方法

当手工通过new的方式建立vm时,需要手动调用InitVM和/或ReInitVM,并使用CopyContext方法从其他VM中复制DataContext,Session,ModelState等值


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号