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
}
}