暂时注释实体控制器的高级功能,仅保留添删改查

This commit is contained in:
大石头 2023-03-19 22:24:36 +08:00
parent b63c8d9d37
commit ad674ce9e4
5 changed files with 957 additions and 991 deletions

View File

@ -1,33 +0,0 @@
using Microsoft.AspNetCore.Mvc;
namespace NewLife.Cube2.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}

View File

@ -32,4 +32,8 @@
<ProjectReference Include="..\NewLife.Cube\NewLife.Cube.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Controllers\" />
</ItemGroup>
</Project>

View File

@ -336,21 +336,21 @@ public class EntityController<TEntity> : ReadOnlyEntityController<TEntity> where
return att;
}
/// <summary>批量启用</summary>
/// <param name="keys">主键集合</param>
/// <param name="reason">操作原因</param>
/// <returns></returns>
[EntityAuthorize(PermissionFlags.Update)]
[HttpPost]
public virtual ActionResult EnableSelect(String keys, String reason) => EnableOrDisableSelect(true, reason);
///// <summary>批量启用</summary>
///// <param name="keys">主键集合</param>
///// <param name="reason">操作原因</param>
///// <returns></returns>
//[EntityAuthorize(PermissionFlags.Update)]
//[HttpPost]
//public virtual ActionResult EnableSelect(String keys, String reason) => EnableOrDisableSelect(true, reason);
/// <summary>批量禁用</summary>
/// <param name="keys">主键集合</param>
/// <param name="reason">操作原因</param>
/// <returns></returns>
[EntityAuthorize(PermissionFlags.Update)]
[HttpPost]
public virtual ActionResult DisableSelect(String keys, String reason) => EnableOrDisableSelect(false, reason);
///// <summary>批量禁用</summary>
///// <param name="keys">主键集合</param>
///// <param name="reason">操作原因</param>
///// <returns></returns>
//[EntityAuthorize(PermissionFlags.Update)]
//[HttpPost]
//public virtual ActionResult DisableSelect(String keys, String reason) => EnableOrDisableSelect(false, reason);
/// <summary>
/// 批量启用或禁用
@ -388,162 +388,162 @@ public class EntityController<TEntity> : ReadOnlyEntityController<TEntity> where
#endregion
#region Action
/// <summary>导入Excel</summary>
/// 当前采用前端解析的excel表头第一行数据无效从第二行开始处理
/// <returns></returns>
[EntityAuthorize(PermissionFlags.Insert)]
[DisplayName("导入Excel")]
[HttpPost]
public virtual ActionResult ImportExcel(String data)
{
if (String.IsNullOrWhiteSpace(data)) return Json(500, null, $"“{nameof(data)}”不能为 null 或空白。");
try
{
var fact = Factory;
var dal = fact.Session.Dal;
var type = Activator.CreateInstance(fact.EntityType);
var json = new JsonParser(data);
var dataList = json.Decode() as IList<Object>;
///// <summary>导入Excel</summary>
///// 当前采用前端解析的excel表头第一行数据无效从第二行开始处理
///// <returns></returns>
//[EntityAuthorize(PermissionFlags.Insert)]
//[DisplayName("导入Excel")]
//[HttpPost]
//public virtual ActionResult ImportExcel(String data)
//{
// if (String.IsNullOrWhiteSpace(data)) return Json(500, null, $"“{nameof(data)}”不能为 null 或空白。");
// try
// {
// var fact = Factory;
// var dal = fact.Session.Dal;
// var type = Activator.CreateInstance(fact.EntityType);
// var json = new JsonParser(data);
// var dataList = json.Decode() as IList<Object>;
//解析json
//var dataList = JArray.Parse(data);
var errorString = String.Empty;
Int32 okSum = 0, fiSum = 0;
// //解析json
// //var dataList = JArray.Parse(data);
// var errorString = String.Empty;
// Int32 okSum = 0, fiSum = 0;
//using var tran = Entity<TEntity>.Meta.CreateTrans();
foreach (var itemD in dataList)
{
var item = itemD.ToDictionary();
if (item[fact.Fields[1].Name].ToString() == fact.Fields[1].DisplayName) //判断首行是否为标体列
continue;
// //using var tran = Entity<TEntity>.Meta.CreateTrans();
// foreach (var itemD in dataList)
// {
// var item = itemD.ToDictionary();
// if (item[fact.Fields[1].Name].ToString() == fact.Fields[1].DisplayName) //判断首行是否为标体列
// continue;
//检查主字段是否重复
if (Entity<TEntity>.Find(fact.Master.Name, item[fact.Master.Name].ToString()) == null)
{
//var entity = item.ToJson().ToJsonEntity(fact.EntityType);
var entity = fact.Create();
// //检查主字段是否重复
// if (Entity<TEntity>.Find(fact.Master.Name, item[fact.Master.Name].ToString()) == null)
// {
// //var entity = item.ToJson().ToJsonEntity(fact.EntityType);
// var entity = fact.Create();
foreach (var fieldsItem in fact.Fields)
{
if (!item.ContainsKey(fieldsItem.Name))
{
if (!fieldsItem.IsNullable)
fieldsItem.FromExcelToEntity(item, entity);
}
else
fieldsItem.FromExcelToEntity(item, entity);
}
// foreach (var fieldsItem in fact.Fields)
// {
// if (!item.ContainsKey(fieldsItem.Name))
// {
// if (!fieldsItem.IsNullable)
// fieldsItem.FromExcelToEntity(item, entity);
// }
// else
// fieldsItem.FromExcelToEntity(item, entity);
// }
if (fact.FieldNames.Contains("CreateTime"))
entity["CreateTime"] = DateTime.Now;
// if (fact.FieldNames.Contains("CreateTime"))
// entity["CreateTime"] = DateTime.Now;
if (fact.FieldNames.Contains("CreateIP"))
entity["CreateIP"] = "--";
// if (fact.FieldNames.Contains("CreateIP"))
// entity["CreateIP"] = "--";
okSum += fact.Session.Insert(entity);
}
else
{
errorString += $"<br>{item[fact.Master.Name]}重复";
fiSum++;
}
}
// okSum += fact.Session.Insert(entity);
// }
// else
// {
// errorString += $"<br>{item[fact.Master.Name]}重复";
// fiSum++;
// }
// }
//tran.Commit();
// //tran.Commit();
WriteLog("导入Excel", true, $"导入Excel[{data}]{dataList.Count()}行)成功!");
// WriteLog("导入Excel", true, $"导入Excel[{data}]{dataList.Count()}行)成功!");
return Json(0, $"导入成功:({okSum}行),失败({fiSum}行){errorString}");
}
catch (Exception ex)
{
XTrace.WriteException(ex);
// return Json(0, $"导入成功:({okSum}行),失败({fiSum}行){errorString}");
// }
// catch (Exception ex)
// {
// XTrace.WriteException(ex);
WriteLog("导入Excel", false, ex.GetMessage());
// WriteLog("导入Excel", false, ex.GetMessage());
return Json(500, ex.GetMessage(), ex);
}
}
// return Json(500, ex.GetMessage(), ex);
// }
//}
#endregion
#region
/// <summary>删除选中</summary>
/// <returns></returns>
[EntityAuthorize(PermissionFlags.Delete)]
[DisplayName("删除选中")]
[HttpPost]
public virtual ActionResult DeleteSelect()
{
var count = 0;
var keys = SelectKeys;
if (keys != null && keys.Length > 0)
{
using var tran = Entity<TEntity>.Meta.CreateTrans();
var list = new List<IEntity>();
foreach (var item in keys)
{
var entity = Entity<TEntity>.FindByKey(item);
if (entity != null)
{
// 验证数据权限
if (Valid(entity, DataObjectMethodType.Delete, true)) list.Add(entity);
///// <summary>删除选中</summary>
///// <returns></returns>
//[EntityAuthorize(PermissionFlags.Delete)]
//[DisplayName("删除选中")]
//[HttpPost]
//public virtual ActionResult DeleteSelect()
//{
// var count = 0;
// var keys = SelectKeys;
// if (keys != null && keys.Length > 0)
// {
// using var tran = Entity<TEntity>.Meta.CreateTrans();
// var list = new List<IEntity>();
// foreach (var item in keys)
// {
// var entity = Entity<TEntity>.FindByKey(item);
// if (entity != null)
// {
// // 验证数据权限
// if (Valid(entity, DataObjectMethodType.Delete, true)) list.Add(entity);
count++;
}
}
list.Delete();
tran.Commit();
}
return JsonRefresh($"共删除{count}行数据");
}
// count++;
// }
// }
// list.Delete();
// tran.Commit();
// }
// return JsonRefresh($"共删除{count}行数据");
//}
/// <summary>删除全部</summary>
/// <returns></returns>
[EntityAuthorize(PermissionFlags.Delete)]
[DisplayName("删除全部")]
[HttpPost]
public virtual ActionResult DeleteAll()
{
var url = Request.GetReferer();
///// <summary>删除全部</summary>
///// <returns></returns>
//[EntityAuthorize(PermissionFlags.Delete)]
//[DisplayName("删除全部")]
//[HttpPost]
//public virtual ActionResult DeleteAll()
//{
// var url = Request.GetReferer();
var count = 0;
var p = Session[CacheKey] as Pager;
p = new Pager(p);
if (p != null)
{
// 循环多次删除
for (var i = 0; i < 10; i++)
{
p.PageIndex = i + 1;
p.PageSize = 100_000;
// 不要查记录数
p.RetrieveTotalCount = false;
// var count = 0;
// var p = Session[CacheKey] as Pager;
// p = new Pager(p);
// if (p != null)
// {
// // 循环多次删除
// for (var i = 0; i < 10; i++)
// {
// p.PageIndex = i + 1;
// p.PageSize = 100_000;
// // 不要查记录数
// p.RetrieveTotalCount = false;
var list = SearchData(p).ToList();
if (list.Count == 0) break;
// var list = SearchData(p).ToList();
// if (list.Count == 0) break;
count += list.Count;
//list.Delete();
using var tran = Entity<TEntity>.Meta.CreateTrans();
var list2 = new List<IEntity>();
foreach (var entity in list)
{
// 验证数据权限
if (Valid(entity, DataObjectMethodType.Delete, true)) list2.Add(entity);
}
list2.Delete();
tran.Commit();
}
}
// count += list.Count;
// //list.Delete();
// using var tran = Entity<TEntity>.Meta.CreateTrans();
// var list2 = new List<IEntity>();
// foreach (var entity in list)
// {
// // 验证数据权限
// if (Valid(entity, DataObjectMethodType.Delete, true)) list2.Add(entity);
// }
// list2.Delete();
// tran.Commit();
// }
// }
if (Request.IsAjaxRequest())
return JsonRefresh($"共删除{count}行数据");
else if (!url.IsNullOrEmpty())
return Redirect(url);
else
return RedirectToAction("Index");
}
// if (Request.IsAjaxRequest())
// return JsonRefresh($"共删除{count}行数据");
// else if (!url.IsNullOrEmpty())
// return Redirect(url);
// else
// return RedirectToAction("Index");
//}
#endregion
#region
@ -564,121 +564,121 @@ public class EntityController<TEntity> : ReadOnlyEntityController<TEntity> where
#endregion
#region /
/// <summary>同步数据</summary>
/// <returns></returns>
[EntityAuthorize(PermissionFlags.Insert)]
[DisplayName("同步{type}")]
[HttpPost]
public async Task<ActionResult> Sync()
{
//if (id.IsNullOrEmpty()) return RedirectToAction(nameof(Index));
///// <summary>同步数据</summary>
///// <returns></returns>
//[EntityAuthorize(PermissionFlags.Insert)]
//[DisplayName("同步{type}")]
//[HttpPost]
//public async Task<ActionResult> Sync()
//{
// //if (id.IsNullOrEmpty()) return RedirectToAction(nameof(Index));
// 读取系统配置
var ps = Parameter.FindAllByUserID(ManageProvider.User.ID); // UserID=0 && Category=Sync
ps = ps.Where(e => e.Category == "Sync").ToList();
var server = ps.FirstOrDefault(e => e.Name == "Server")?.Value;
var token = ps.FirstOrDefault(e => e.Name == "Token")?.Value;
var models = ps.FirstOrDefault(e => e.Name == "Models")?.Value;
// // 读取系统配置
// var ps = Parameter.FindAllByUserID(ManageProvider.User.ID); // UserID=0 && Category=Sync
// ps = ps.Where(e => e.Category == "Sync").ToList();
// var server = ps.FirstOrDefault(e => e.Name == "Server")?.Value;
// var token = ps.FirstOrDefault(e => e.Name == "Token")?.Value;
// var models = ps.FirstOrDefault(e => e.Name == "Models")?.Value;
if (server.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Server");
if (token.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Token");
if (models.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Models");
// if (server.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Server");
// if (token.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Token");
// if (models.IsNullOrEmpty()) throw new ArgumentNullException("未配置 Sync:Models");
var mds = models.Split(",");
// var mds = models.Split(",");
//// 创建实体工厂
//var etype = mds.FirstOrDefault(e => e.Replace(".", "_") == id);
//var fact = etype.GetTypeEx()?.AsFactory();
//if (fact == null) throw new ArgumentNullException(nameof(id), "未找到模型 " + id);
// //// 创建实体工厂
// //var etype = mds.FirstOrDefault(e => e.Replace(".", "_") == id);
// //var fact = etype.GetTypeEx()?.AsFactory();
// //if (fact == null) throw new ArgumentNullException(nameof(id), "未找到模型 " + id);
// 找到控制器,以识别动作地址
var cs = GetControllerAction();
var ctrl = cs[0].IsNullOrEmpty() ? cs[1] : $"{cs[0]}/{cs[1]}";
if (!mds.Contains(ctrl)) throw new InvalidOperationException($"[{ctrl}]未配置为允许同步 Sync:Models");
// // 找到控制器,以识别动作地址
// var cs = GetControllerAction();
// var ctrl = cs[0].IsNullOrEmpty() ? cs[1] : $"{cs[0]}/{cs[1]}";
// if (!mds.Contains(ctrl)) throw new InvalidOperationException($"[{ctrl}]未配置为允许同步 Sync:Models");
// 创建客户端,准备发起请求
var url = server.EnsureEnd("/") + $"{ctrl}/Json/{token}?PageSize=100000";
// // 创建客户端,准备发起请求
// var url = server.EnsureEnd("/") + $"{ctrl}/Json/{token}?PageSize=100000";
var http = new HttpClient
{
BaseAddress = new Uri(url)
};
// var http = new HttpClient
// {
// BaseAddress = new Uri(url)
// };
var sw = Stopwatch.StartNew();
// var sw = Stopwatch.StartNew();
var list = await http.InvokeAsync<TEntity[]>(HttpMethod.Get, null);
// var list = await http.InvokeAsync<TEntity[]>(HttpMethod.Get, null);
sw.Stop();
// sw.Stop();
var fact = Factory;
XTrace.WriteLine("[{0}]共同步数据[{1:n0}]行,耗时{2:n0}ms数据源{3}", fact.EntityType.FullName, list.Length, sw.ElapsedMilliseconds, url);
// var fact = Factory;
// XTrace.WriteLine("[{0}]共同步数据[{1:n0}]行,耗时{2:n0}ms数据源{3}", fact.EntityType.FullName, list.Length, sw.ElapsedMilliseconds, url);
var arrType = fact.EntityType.MakeArrayType();
if (list.Length > 0)
{
XTrace.WriteLine("[{0}]准备覆盖写入[{1}]行数据", fact.EntityType.FullName, list.Length);
using var tran = fact.Session.CreateTrans();
// var arrType = fact.EntityType.MakeArrayType();
// if (list.Length > 0)
// {
// XTrace.WriteLine("[{0}]准备覆盖写入[{1}]行数据", fact.EntityType.FullName, list.Length);
// using var tran = fact.Session.CreateTrans();
// 清空
try
{
fact.Session.Truncate();
}
catch (Exception ex) { XTrace.WriteException(ex); }
// // 清空
// try
// {
// fact.Session.Truncate();
// }
// catch (Exception ex) { XTrace.WriteException(ex); }
// 插入
//ms.All(e => { e.AllChilds = new List<Menu>(); return true; });
fact.AllowInsertIdentity = true;
//ms.Insert();
//var empty = typeof(List<>).MakeGenericType(fact.EntityType).CreateInstance();
foreach (IEntity entity in list)
{
if (entity is IEntityTree tree) tree.AllChilds.Clear();
// // 插入
// //ms.All(e => { e.AllChilds = new List<Menu>(); return true; });
// fact.AllowInsertIdentity = true;
// //ms.Insert();
// //var empty = typeof(List<>).MakeGenericType(fact.EntityType).CreateInstance();
// foreach (IEntity entity in list)
// {
// if (entity is IEntityTree tree) tree.AllChilds.Clear();
entity.Insert();
}
fact.AllowInsertIdentity = false;
// entity.Insert();
// }
// fact.AllowInsertIdentity = false;
tran.Commit();
}
// tran.Commit();
// }
return Index();
}
// return Index();
//}
/// <summary>从服务器本地目录还原</summary>
/// <returns></returns>
[EntityAuthorize(PermissionFlags.Insert)]
[DisplayName("还原")]
[HttpPost]
public virtual ActionResult Restore()
{
try
{
var fact = Factory;
var dal = fact.Session.Dal;
///// <summary>从服务器本地目录还原</summary>
///// <returns></returns>
//[EntityAuthorize(PermissionFlags.Insert)]
//[DisplayName("还原")]
//[HttpPost]
//public virtual ActionResult Restore()
//{
// try
// {
// var fact = Factory;
// var dal = fact.Session.Dal;
var name = GetType().Name.TrimEnd("Controller");
var fileName = $"{name}_*.gz";
// var name = GetType().Name.TrimEnd("Controller");
// var fileName = $"{name}_*.gz";
var di = NewLife.Setting.Current.BackupPath.GetBasePath().AsDirectory();
//var fi = di?.GetFiles(fileName)?.LastOrDefault();
var fi = di?.GetFiles(fileName)?.OrderByDescending(e => e.Name).FirstOrDefault();
if (fi == null || !fi.Exists) throw new XException($"找不到[{fileName}]的备份文件");
// var di = NewLife.Setting.Current.BackupPath.GetBasePath().AsDirectory();
// //var fi = di?.GetFiles(fileName)?.LastOrDefault();
// var fi = di?.GetFiles(fileName)?.OrderByDescending(e => e.Name).FirstOrDefault();
// if (fi == null || !fi.Exists) throw new XException($"找不到[{fileName}]的备份文件");
var rs = dal.Restore(fi.FullName, fact.Table.DataTable);
// var rs = dal.Restore(fi.FullName, fact.Table.DataTable);
WriteLog("恢复", true, $"恢复[{fileName}]{rs:n0}行)成功!");
// WriteLog("恢复", true, $"恢复[{fileName}]{rs:n0}行)成功!");
return Json(0, $"恢复[{fileName}]{rs:n0}行)成功!");
}
catch (Exception ex)
{
XTrace.WriteException(ex);
// return Json(0, $"恢复[{fileName}]{rs:n0}行)成功!");
// }
// catch (Exception ex)
// {
// XTrace.WriteException(ex);
WriteLog("恢复", false, ex.GetMessage());
// WriteLog("恢复", false, ex.GetMessage());
return Json(500, null, ex);
}
}
// return Json(500, null, ex);
// }
//}
#endregion
}

File diff suppressed because it is too large Load Diff

View File

@ -1,110 +1,105 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NewLife.Cube.Common;
using NewLife.Cube.Common;
namespace NewLife.Cube.ViewModels
namespace NewLife.Cube.ViewModels;
/// <summary>
/// 字段模型
/// </summary>
public class FieldModel
{
private String _name;
private String _columnName;
/// <summary>
/// 字段模型
/// 默认CamelCase小驼峰
/// </summary>
public class FieldModel
readonly FormatType _FormatType = FormatType.CamelCase;
/// <summary>
/// 默认CamelCase小驼峰
/// </summary>
public FieldModel() { }
/// <summary>
///
/// </summary>
/// <param name="formatType">0-小驼峰1-小写2-保持默认</param>
public FieldModel(FormatType formatType) => _FormatType = formatType;
/// <summary>备注</summary>
public String Description { get; set; }
/// <summary>说明</summary>
public String DisplayName { get; set; }
/// <summary>属性名</summary>
public String Name
{
private String _name;
private String _columnName;
/// <summary>
/// 默认CamelCase小驼峰
/// </summary>
public FormatType FormatType = FormatType.CamelCase;
/// <summary>
/// 默认CamelCase小驼峰
/// </summary>
public FieldModel() { }
/// <summary>
///
/// </summary>
/// <param name="formatType">0-小驼峰1-小写2-保持默认</param>
public FieldModel(FormatType formatType) => FormatType = formatType;
/// <summary>备注</summary>
public String Description { get; set; }
/// <summary>说明</summary>
public String DisplayName { get; set; }
/// <summary>属性名</summary>
public String Name
{
get => _name.FormatName(FormatType);
internal set => _name = value;
}
/// <summary>是否允许空</summary>
public Boolean IsNullable { get; internal set; }
/// <summary>长度</summary>
public Int32 Length { get; internal set; }
/// <summary>是否数据绑定列</summary>
public Boolean IsDataObjectField { get; set; }
/// <summary>是否动态字段</summary>
public Boolean IsDynamic { get; set; }
/// <summary>用于数据绑定的字段名</summary>
/// <remarks>
/// 默认使用BindColumn特性中指定的字段名如果没有指定则使用属性名。
/// 字段名可能两边带有方括号等标识符
/// </remarks>
public String ColumnName
{
get => _columnName.FormatName(FormatType);
set => _columnName = value;
}
/// <summary>是否只读</summary>
/// <remarks>set { _ReadOnly = value; } 放出只读属性的设置,比如在编辑页面的时候,有的字段不能修改 如修改用户时 不能修改用户名</remarks>
public Boolean ReadOnly { get; set; }
/// <summary>
/// 字段类型
/// </summary>
public String TypeStr { get; set; } = nameof(String);
#region
/// <summary>
/// 是否定制字段
/// </summary>
public Boolean IsCustom { get; set; }
/// <summary>前缀名称。放在某字段之前</summary>
public String BeforeName { get; set; }
/// <summary>后缀名称。放在某字段之后</summary>
public String AfterName { get; set; }
/// <summary>链接</summary>
public String Url { get; set; }
/// <summary>标题。数据单元格上的提示文字</summary>
public String Title { get; set; }
/// <summary>头部文字</summary>
public String Header { get; set; }
/// <summary>头部链接。一般是排序</summary>
public String HeaderUrl { get; set; }
/// <summary>头部标题。数据移上去后显示的文字</summary>
public String HeaderTitle { get; set; }
/// <summary>数据动作。设为action时走ajax请求</summary>
public String DataAction { get; set; }
#endregion
get => _name.FormatName(_FormatType);
internal set => _name = value;
}
/// <summary>是否允许空</summary>
public Boolean IsNullable { get; internal set; }
/// <summary>长度</summary>
public Int32 Length { get; internal set; }
/// <summary>是否数据绑定列</summary>
public Boolean IsDataObjectField { get; set; }
/// <summary>是否动态字段</summary>
public Boolean IsDynamic { get; set; }
/// <summary>用于数据绑定的字段名</summary>
/// <remarks>
/// 默认使用BindColumn特性中指定的字段名如果没有指定则使用属性名。
/// 字段名可能两边带有方括号等标识符
/// </remarks>
public String ColumnName
{
get => _columnName.FormatName(_FormatType);
set => _columnName = value;
}
/// <summary>是否只读</summary>
/// <remarks>set { _ReadOnly = value; } 放出只读属性的设置,比如在编辑页面的时候,有的字段不能修改 如修改用户时 不能修改用户名</remarks>
public Boolean ReadOnly { get; set; }
/// <summary>
/// 字段类型
/// </summary>
public String TypeStr { get; set; } = nameof(String);
#region
/// <summary>
/// 是否定制字段
/// </summary>
public Boolean IsCustom { get; set; }
/// <summary>前缀名称。放在某字段之前</summary>
public String BeforeName { get; set; }
/// <summary>后缀名称。放在某字段之后</summary>
public String AfterName { get; set; }
/// <summary>链接</summary>
public String Url { get; set; }
/// <summary>标题。数据单元格上的提示文字</summary>
public String Title { get; set; }
/// <summary>头部文字</summary>
public String Header { get; set; }
/// <summary>头部链接。一般是排序</summary>
public String HeaderUrl { get; set; }
/// <summary>头部标题。数据移上去后显示的文字</summary>
public String HeaderTitle { get; set; }
/// <summary>数据动作。设为action时走ajax请求</summary>
public String DataAction { get; set; }
#endregion
}