using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection; using System.Text.Json.Serialization; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; using WalkingTec.Mvvm.Core.Extensions; using WalkingTec.Mvvm.Core.Support.Json; namespace WalkingTec.Mvvm.Core { /// /// 所有ViewModel的基类,提供了基本的功能 /// public class BaseVM : IBaseVM { /// /// BaseVM /// public BaseVM() { FC = new Dictionary(); } #region Property [JsonIgnore] public WTMContext Wtm { get; set; } private Guid _uniqueId; /// /// VM实例的Id /// [JsonIgnore] public string UniqueId { get { if (_uniqueId == Guid.Empty) { _uniqueId = Guid.NewGuid(); } return _uniqueId.ToNoSplitString(); } } /// /// 前台传递过来的弹出窗口ID,多层弹出窗口用逗号分隔 /// [JsonIgnore] public string WindowIds { get => Wtm?.WindowIds; } private string _viewdivid; /// /// PartialView中主Div的Id /// [JsonIgnore] public string ViewDivId { set { _viewdivid = value; } get { if (string.IsNullOrEmpty(_viewdivid)) { _viewdivid = "ViewDiv" + UniqueId; } return _viewdivid; } } private IDataContext _dc; /// /// 数据库环境 /// [JsonIgnore] public IDataContext DC { get { if (_dc == null) { return Wtm?.DC; } else { return _dc; } } set { _dc = value; } } /// /// 获取VM的全名 /// [JsonIgnore] public string VMFullName { get { var name = GetType().AssemblyQualifiedName; name = name.Substring(0, name.LastIndexOf(", Version=")); return name; } } /// /// 获取VM所在Dll /// [JsonIgnore] public string CreatorAssembly { get; set; } /// /// 获取当前使用的连接字符串 /// [JsonIgnore] public string CurrentCS { get => Wtm?.CurrentCS; } /// /// 记录Controller中传递过来的表单数据 /// [JsonIgnore] public Dictionary FC { get; set; } /// /// 获取配置文件的信息 /// [JsonIgnore] public Configs ConfigInfo { get=> Wtm?.ConfigInfo; } [JsonIgnore] public IUIService UIService { get=> Wtm?.UIService; } /// /// 当前弹出层ID /// [JsonIgnore] public string CurrentWindowId { get => Wtm?.CurrentWindowId; } /// /// 父级弹出层ID /// [JsonIgnore] public string ParentWindowId { get => Wtm?.ParentWindowId; } [JsonIgnore] public IDistributedCache Cache { get => Wtm?.Cache; } /// /// 当前登录人信息 /// [JsonIgnore] public LoginUserInfo LoginUserInfo { get=> Wtm?.LoginUserInfo;} /// /// 当前Url /// [JsonIgnore] public string CurrentUrl { get => Wtm?.BaseUrl; } /// /// 记录原始提交页面 /// [JsonIgnore] public string FromView { get; set; } /// /// 记录当前页面 /// [JsonIgnore] public string CurrentView { get; set; } /// /// Session信息 /// [JsonIgnore] public ISessionService Session { get => Wtm?.Session; } /// /// Controller传递过来的ModelState信息 /// [JsonIgnore] public IModelStateService MSD { get => Wtm?.MSD; } /// /// 用于保存删除的附件ID /// public List DeletedFileIds { get; set; } = new List(); [JsonIgnore] public string ControllerName { get; set; } [JsonIgnore] public IStringLocalizer Localizer { get => Wtm?.Localizer; } #endregion #region Event /// /// InitVM完成后触发的事件 /// public event Action OnAfterInit; /// /// ReInitVM完成后触发的事件 /// public event Action OnAfterReInit; #endregion #region Method /// /// 调用 InitVM 并触发 OnAfterInit 事件 /// public void DoInit() { InitVM(); OnAfterInit?.Invoke(this); } /// /// 调用 ReInitVM 并触发 OnAfterReInit 事件 /// public void DoReInit() { ReInitVM(); OnAfterReInit?.Invoke(this); } /// /// 初始化ViewModel,框架会在创建VM实例之后自动调用本函数 /// protected virtual void InitVM() { } /// /// 从新初始化ViewModel,框架会在验证失败时自动调用本函数 /// protected virtual void ReInitVM() { InitVM(); } /// /// 验证函数,MVC会在提交数据的时候自动调用本函数 /// /// public virtual void Validate() { return; } /// /// 将源VM的上数据库上下文,Session,登录用户信息,模型状态信息,缓存信息等内容复制到本VM中 /// /// 复制的源 public void CopyContext(BaseVM vm) { Wtm = vm.Wtm; FC = vm.FC; CreatorAssembly = vm.CreatorAssembly; } #endregion } }