地区的扩展属性AllParents和AllChilds改为方法,避免asp.net验证时进入无限深度

This commit is contained in:
智能大石头 2025-03-31 20:20:43 +08:00
parent 521ee5c0d7
commit 9c5ac245b2
3 changed files with 73 additions and 19 deletions

View File

@ -113,9 +113,14 @@ public partial class Area : Entity<Area>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public Area Parent => Extends.Get(nameof(Parent), k => FindByID(ParentID) ?? Root)!;
///// <summary>所有父级,从高到底</summary>
//[XmlIgnore, IgnoreDataMember, ScriptIgnore]
//[Obsolete("=>GetAllParents")]
//public IList<Area> AllParents => Extends.Get(nameof(AllParents), k => GetAllParents())!;
/// <summary>所有父级,从高到底</summary>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public IList<Area> AllParents => Extends.Get(nameof(AllParents), k =>
/// <returns></returns>
public IList<Area> GetAllParents()
{
var list = new List<Area>();
var entity = Parent;
@ -132,14 +137,14 @@ public partial class Area : Entity<Area>
list.Reverse();
return list;
})!;
}
/// <summary>父级路径</summary>
public String ParentPath
public String? ParentPath
{
get
{
var list = AllParents;
var list = GetAllParents();
if (list != null && list.Count > 0) return list.Where(r => !r.IsVirtual).Join("/", r => r.Name);
return Parent?.Name;
@ -163,18 +168,22 @@ public partial class Area : Entity<Area>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public IList<Area> Childs => Extends.Get(nameof(Childs), k => FindAllByParentID(ID).Where(e => e.Enable).ToList())!;
///// <summary>子孙级区域。支持省市区,不支持乡镇街道</summary>
//[XmlIgnore, IgnoreDataMember, ScriptIgnore]
//[Obsolete("=>GetAllChilds")]
//public IList<Area> AllChilds => Extends.Get(nameof(AllChilds), k => GetAllChilds())!;
/// <summary>子孙级区域。支持省市区,不支持乡镇街道</summary>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public IList<Area> AllChilds => Extends.Get(nameof(AllChilds), k =>
public IList<Area> GetAllChilds()
{
var list = new List<Area>();
foreach (var item in Childs)
{
list.Add(item);
if (item.Level < 3) list.AddRange(item.AllChilds);
if (item.Level < 3) list.AddRange(item.GetAllChilds());
}
return list;
});
}
/// <summary>是否虚拟地区</summary>
public Boolean IsVirtual => Name.EqualIgnoreCase("市辖区", "直辖县", "直辖镇");
@ -508,7 +517,7 @@ public partial class Area : Entity<Area>
var r = FindByNames(ss);
if (r != null)
{
list.AddRange(r.AllParents);
list.AddRange(r.GetAllParents());
list.Add(r);
if (maxLevel > 0 && list.Count > maxLevel) list = list.Take(maxLevel).ToList();
@ -539,7 +548,7 @@ public partial class Area : Entity<Area>
var r = FindAddress(Root, address, maxLevel);
if (r != null)
{
list.AddRange(r.AllParents);
list.AddRange(r.GetAllParents());
list.Add(r);
}

View File

@ -122,7 +122,7 @@ public partial class User : LogEntity<User>, IUser, IAuthUser, IIdentity
#region
/// <summary>物理地址</summary>
[DisplayName("物理地址")]
public String LastLoginAddress => LastLoginIP.IPToAddress();
public String? LastLoginAddress => LastLoginIP?.IPToAddress();
///// <summary>部门</summary>
//[XmlIgnore, IgnoreDataMember, ScriptIgnore]
@ -137,7 +137,7 @@ public partial class User : LogEntity<User>, IUser, IAuthUser, IIdentity
/// 地区名
/// </summary>
[Map(nameof(AreaId))]
public String AreaName => Area.FindByID(AreaId)?.Path;
public String? AreaName => Area.FindByID(AreaId)?.Path;
#endregion
#region
@ -693,7 +693,7 @@ public partial interface IUser
IRole[] Roles { get; }
/// <summary>角色名</summary>
String RoleName { get; }
String? RoleName { get; }
/// <summary>用户是否拥有当前菜单的指定权限</summary>
/// <param name="menu">指定菜单</param>

View File

@ -40,16 +40,16 @@ public class AreaTests
XTrace.WriteLine("北京");
r = Area.FindByName(0, "北京");
Assert.Equal(17, r.AllChilds.Count);
Assert.Equal("北京/延庆", r.AllChilds[^1].Path);
Assert.Equal(17, r.GetAllChilds().Count);
Assert.Equal("北京/延庆", r.GetAllChilds()[^1].Path);
XTrace.WriteLine("容县");
r = Area.FindByID(450921);
Assert.Equal("容县", r.Name);
Assert.Equal(2, r.AllParents.Count);
Assert.Equal(2, r.GetAllParents().Count);
Assert.Equal("广西/玉林", r.ParentPath);
Assert.Equal(15, r.AllChilds.Count);
Assert.Equal("广西/玉林/容县/容州", r.AllChilds[0].Path);
Assert.Equal(15, r.GetAllChilds().Count);
Assert.Equal("广西/玉林/容县/容州", r.GetAllChilds()[0].Path);
var r2 = Area.FindByIDs(450921102, 450921, 450900, 450000);
Assert.Equal("杨梅", r2.Name);
@ -153,6 +153,51 @@ public class AreaTests
}
}
[TestOrder(50)]
[Fact]
public void ParentTest()
{
var ar = Area.FindByID(450921102);
Assert.Equal("杨梅", ar.Name);
var ps = ar.GetAllParents();
Assert.Equal(3, ps.Count);
ar = ar.Parent;
Assert.Equal("容县", ar.Name);
ar = ar.Parent;
Assert.Equal("玉林", ar.Name);
ar = ar.Parent;
Assert.Equal("广西", ar.Name);
ar = ar.Parent;
Assert.Equal(0, ar.ID);
Assert.Equal(Area.Root, ar);
}
[TestOrder(50)]
[Fact]
public void ParentTest2()
{
var ar = Area.FindByID(310116);
Assert.Equal("金山", ar.Name);
var ps = ar.GetAllParents();
Assert.Equal(2, ps.Count);
ar = ar.Parent;
Assert.Equal("市辖区", ar.Name);
ar = ar.Parent;
Assert.Equal("上海", ar.Name);
ar = ar.Parent;
Assert.Equal(0, ar.ID);
Assert.Equal(Area.Root, ar);
}
[Fact]
public async void Download()
{