QQ:1187362408 欢迎技术交流和学习
关于系统产品升级报告管理,业务需求:
TODO:
1,升级报告管理:依据各县区制定升级报告(关联sAreaCode,给每个地区观看具体升级报告信息)
2,运用的技术:依赖注入,变量声明,三元表达式,常用字符串相关操作方法,ADO.NET,EF机制,T4模板自动生成实体类,ref变量与可null变量巧用,属性实际运用,唯一性验证,url传递中文编码和解码问题
讲解篇:1,服务端aspx,2,服务端后台返回数据(这里采用服务器端程序:aspx.cs)
TODO:
一,讲解篇依据:技术分类进行逐一讲解
二,开源思想:分享和总结技术
一,讲解篇依据:技术分类进行逐一讲解:
1,依赖注入
/*TODO:非功能性辅助需求
* 业务需求:
* 升级报告管理:依据各县区制定升级报告(关联sAreaCode,给每个地区观看具体升级报告信息)
* 主表:sys_UpdateReport 子表:sys_UpdateReportCustom
* 标识:gKey【键值】,sVersionNunber【版本信息关联子表】,sAreaCode【对每一个地区升级】
*/
Isys_UpdateReportCustomBLL iBLL = IOCFactory.GetIOCResolve<Isys_UpdateReportCustomBLL>();//依赖注入 版本升级报告业务逻辑层接口
Isys_AreaDAL iAreaDAL = IOCFactory.GetIOCResolve<Isys_AreaDAL>();//依赖注入 地区信息数据层接口
2,变量声明
private string[] sareacodearray = new string[] { };//声明 地区编码【可能是一对数组】
private string sareacode { get; set; }//声明 地区编码
private int sareacodearraylength { get; set; }//声明 地区编码长度
private sys_Area modelArea = new sys_Area();//声明并初始化地区实体,以便获取地区信息
3,三元表达式
<pre name="code" class="csharp">sVNunber = svb == null ? "" : svb.Value;
sareanamearray = sareanamearray != "" ? sareanamearray.Substring(0, sareanamearray.Length - 1) : "";//截取,最后一个字符^
4,常用字符串相关操作方法
/// <summary>
/// 依据地区编码返回地区名称
/// </summary>
/// <param name="sAreaCode">地区编码</param>
/// <returns>地区名称(可能是多个)</returns>
public string GetsAreaNameBysAreaCode(object sAreaCode)
{
string sareanamearray = "";//声明 地区名称【可能是一对数组】
if (sAreaCode != null && sAreaCode.ToString() != "")
{
sareacode = sAreaCode.ToString();
/*if (sareacode.IndexOf('^') == -1)
sareacode = sareacode + '^';//当用户输入一个地区编码,忘记给它自定义添加'^'符号时,检索后台添加一个,便于存取数据及页面展示*/
sareacodearray = sareacode.Split('^');//地区编码数组
sareacodearraylength = sareacodearray.Length;//地区编码数组长度
for (int i = 0; i < sareacodearray.Length; i++)//sAreaCode格式实际中为:code1^code2,sareanamearray格式实际中为:name1,name2
{
modelArea = iAreaDAL.GetModelByID(sareacodearray[i]);//地区
if (modelArea != null && !string.IsNullOrEmpty(modelArea.sName))
{
sareanamearray += modelArea.sName + ",";//地区名称,以','隔开页面展示
continue;
}
}
sareanamearray = sareanamearray != "" ? sareanamearray.Substring(0, sareanamearray.Length - 1) : "";//截取,最后一个字符^
}
return sareanamearray;
}
5,ADO.NET
/// <summary>
/// 定制需求【依据主表sys_UpdateReport中标识VersionNunber返回List<sys_UpdateReportCustom>】
/// </summary>
/// <param name="where">VersionNunber</param>
/// <returns>sys_UpdateReportCustom数量</returns>
public int? GetCustomList(System.Linq.Expressions.Expression<Func<sys_UpdateReportCustom, bool>> where)
{
return iDal.GetList(where).ToList().Count;
}
/// <summary>
/// 定制需求【依据主表sys_UpdateReport中标识VersionNunber返回List<sys_UpdateReportCustom>】
/// </summary>
/// <param name="where">VersionNunber</param>
/// <returns>List<sys_UpdateReportCustom></returns>
public List<sys_UpdateReportCustom> GetList(System.Linq.Expressions.Expression<Func<sys_UpdateReportCustom, bool>> where)
{
return iDal.GetList(where);
}
public sys_UpdateReportCustom GetModelByID(Guid gkey)
{
return iDal.GetModelByCondition(P => P.gKey.Equals(gkey));
}
6,EF机制
private Isys_UpdateReportCustomDAL iDal;
private IUnitOfWork<BaseFrameworkEntities> uwork;
public sys_UpdateReportCustomBLL(IUnitOfWork<BaseFrameworkEntities> uwork, Isys_UpdateReportCustomDAL iDal)
{
this.iDal = iDal;
this.uwork = uwork;
this.uwork.LogEvent = new LogEventHandler(Sys_LogBLL.WriteLog);
}
7,T4模板自动生成实体类
/// <summary>
/// 没有元数据文档可用。
/// </summary>
[EdmEntityTypeAttribute(NamespaceName="HIP_BaseFrameworkModel", Name="sys_UpdateReportCustom")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class sys_UpdateReportCustom : EntityObject
{
#region 工厂方法
/// <summary>
/// 创建新的 sys_UpdateReportCustom 对象。
/// </summary>
/// <param name="gKey">gKey 属性的初始值。</param>
/// <param name="sVersionNunber">sVersionNunber 属性的初始值。</param>
/// <param name="sAreaCode">sAreaCode 属性的初始值。</param>
/// <param name="dOperateTime">dOperateTime 属性的初始值。</param>
public static sys_UpdateReportCustom Createsys_UpdateReportCustom(global::System.Guid gKey, global::System.String sVersionNunber, global::System.String sAreaCode, global::System.DateTime dOperateTime)
{
sys_UpdateReportCustom sys_UpdateReportCustom = new sys_UpdateReportCustom();
sys_UpdateReportCustom.gKey = gKey;
sys_UpdateReportCustom.sVersionNunber = sVersionNunber;
sys_UpdateReportCustom.sAreaCode = sAreaCode;
sys_UpdateReportCustom.dOperateTime = dOperateTime;
return sys_UpdateReportCustom;
}
#endregion
#region 基元属性
/// <summary>
/// 没有元数据文档可用。
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Guid gKey
{
get
{
return _gKey;
}
set
{
if (_gKey != value)
{
OngKeyChanging(value);
ReportPropertyChanging("gKey");
_gKey = StructuralObject.SetValidValue(value);
ReportPropertyChanged("gKey");
OngKeyChanged();
}
}
}
private global::System.Guid _gKey;
partial void OngKeyChanging(global::System.Guid value);
partial void OngKeyChanged();
/// <summary>
/// 没有元数据文档可用。
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.String sVersionNunber
{
get
{
return _sVersionNunber;
}
set
{
OnsVersionNunberChanging(value);
ReportPropertyChanging("sVersionNunber");
_sVersionNunber = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("sVersionNunber");
OnsVersionNunberChanged();
}
}
private global::System.String _sVersionNunber;
partial void OnsVersionNunberChanging(global::System.String value);
partial void OnsVersionNunberChanged();
/// <summary>
/// 没有元数据文档可用。
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.String sAreaCode
{
get
{
return _sAreaCode;
}
set
{
OnsAreaCodeChanging(value);
ReportPropertyChanging("sAreaCode");
_sAreaCode = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("sAreaCode");
OnsAreaCodeChanged();
}
}
private global::System.String _sAreaCode;
partial void OnsAreaCodeChanging(global::System.String value);
partial void OnsAreaCodeChanged();
/// <summary>
/// 没有元数据文档可用。
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
[DataMemberAttribute()]
public global::System.String sContent
{
get
{
return _sContent;
}
set
{
OnsContentChanging(value);
ReportPropertyChanging("sContent");
_sContent = StructuralObject.SetValidValue(value, true);
ReportPropertyChanged("sContent");
OnsContentChanged();
}
}
private global::System.String _sContent;
partial void OnsContentChanging(global::System.String value);
partial void OnsContentChanged();
/// <summary>
/// 没有元数据文档可用。
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.DateTime dOperateTime
{
get
{
return _dOperateTime;
}
set
{
OndOperateTimeChanging(value);
ReportPropertyChanging("dOperateTime");
_dOperateTime = StructuralObject.SetValidValue(value);
ReportPropertyChanged("dOperateTime");
OndOperateTimeChanged();
}
}
private global::System.DateTime _dOperateTime;
partial void OndOperateTimeChanging(global::System.DateTime value);
partial void OndOperateTimeChanged();
#endregion
}
8,ref变量与可null变量巧用
int? sVersionNunber = null;//某版本下,定制需求数量
string sVNunber = "";//版本号
/// <summary>
/// 引用类型变量sVersionNunber,通过指针传递改变其初始值
/// </summary>
/// <param name="sVersionNunber">引用类型变量sVersionNunber</param>
/// <param name="sVNunber">当前版本号:sversionnunber</param>
public void GetUCustomLengthBysVNunber(ref int? sVersionNunber, string sVNunber)
{
if (!string.IsNullOrEmpty(sVNunber))
{
sVersionNunber = iCuBLL.GetCustomList(P => P.sVersionNunber == sVNunber);
}
}
9,只读属性(为什么只读,因为效率比可写可读属性高)实际运用
/// <summary>
/// 版本信息
/// </summary>
private string SVNBER
{
get
{
if (!string.IsNullOrEmpty(Request.QueryString["sversionnunber"]))
{
return HttpUtility.UrlDecode(Request.QueryString["sversionnunber"]);//解码版本信息【URL中已编码】
}
else
{
return "";
}
}
}
/// <summary>
/// 主键属性
/// </summary>
private string PKey
{
get
{
if (!string.IsNullOrEmpty(Request.QueryString["gKey"]))
{
return Request.QueryString["gKey"].ToString();
}
else
{
return "";
}
}
}
10,唯一性验证
方法:
//【新增】:验证版本信息是否重复
protected bool CheckAddCode(sys_UpdateReport model)
{
bool isHave = false;
List<sys_UpdateReport> CheckList = iBLL.GetList(P => P.sVersionNunber == model.sVersionNunber);
if (CheckList.Count > 0)
{
isHave = true;
}
return isHave;
}
//【修改】:验证版本信息是否重复
protected bool CheckUpdateCode(sys_UpdateReport model)
{
bool isCheck = false;
List<sys_UpdateReport> CheckList = iBLL.GetList(P => P.sVersionNunber == model.sVersionNunber);
if (CheckList.Count > 1)
{
isCheck = true;
}
else
{
foreach (var item in CheckList)
{
if (!item.gKey.Equals(model.gKey))
{
isCheck = true;
}
}
}
return isCheck;
}
调用:
if (CheckUpdateCode(model))
{
Messages("版本信息重复,请重新输入!");
return;//跳出方法
}
if (CheckAddCode(model))
{
Messages("版本信息重复,请重新输入!");
return;
}
11,url传递中文编码和解码问题
主页面:
sversionnunber = chk.attr("sversionnunber");
//参数:【sversionnunber】版本号
winer.OpenWin(sversionnunber + '_定制需求', GetUrl(this) + 'UpdateReportCustomList.aspx?sversionnunber=' + encodeURI(sversionnunber), 800, 600, false, this);
return false;
子页面:
前段javascript:
var sversionnunber = unescape(getParameter("sversionnunber")); //版本信息
后台aspx.cs:
return HttpUtility.UrlDecode(Request.QueryString["sversionnunber"]);//解码版本信息【URL中已编码】
看完了以上,相信你已经对B/S架构有一个较深的理解了,快向应用程序框架学习吧。
二,开源思想:能够帮助我们快速成长
附图:
【删除】判断是否已【定制需求】
【删除】判断是否已【定制需求】
【新增:版本信息唯一性验证】
地区编码【随便输,只要匹配上就显示】
地区编码【随便输,只要匹配上就显示】