我正在使用C#,asp.net构建审计跟踪。在.aspx页面上,我有几个隐藏字段,它们将自己与常规字段相关联(即txtFirstName - > firstNameTrackerHiddenField)。我设置它,以便当用户输入/选择数据到字段时,隐藏字段获取设置值。例如:
protected void txtFirstName_TextChanged(object sender, EventArgs e)
{
this.FirstNameTrackerHiddenField.Value = "1";
}
现在构建我的审核日志我正在考虑检查每个隐藏字段,拉出非空字段,并附加字符串,具体取决于用户输入/更改的字段。我可以做一堆嵌套的if语句,但那真的很草率。 对不起,如果我没有任何意义,我对编码世界仍然有点新意,我认为这种方法非常简洁,易于实现。以下是我在auditLog方法中的内容:
protected string auditLogString()
{
string auditLog = this.txtAuditLogReadOnly.Text + System.Environment.NewLine + System.Environment.NewLine +
DateTime.Now.ToString() + "- (Incident saved by: " + Page.User.Identity.Name + ") ";
if (this.FirstNameTrackerHiddenField.Value != string.Empty)
{
auditLog += "- with changes to First Name."
if (this.LastNameTrackerHiddenField.Value != string.Empty)
{
auditLog += "- with changes to Last Name."
}
}
return auditLog;
}
这个名单还在继续。有大约50个字段可以循环播放,这就是为什么我想知道是否有更好的方法来解决这个问题...感谢任何输入,请不要粗暴对待我...... :)
答案 0 :(得分:0)
好的,这里有几件事。首先 - 尽量不要在C#中使用+进行字符串连接,除非你连接常量表达式(DateTime.Now和Page.User.Identity.Name不是)。请改用StringBuilder。 C#中的字符串是不可变的。
其次,您可以在文本框中添加自定义属性并收集服务器端的值;不需要额外的隐藏字段。
因此,给出一个示例表格,如: -
<asp:TextBox ID="txtAuditLogReadOnly" runat="server" />
<div id="divContainer" runat="server">
<asp:TextBox ID="t1" runat="server" fieldname="First Name" />
<asp:TextBox ID="t2" runat="server" fieldname="Last Name" />
<asp:TextBox ID="t3" runat="server" fieldname="Shoe Size" />
<asp:TextBox ID="t4" runat="server" fieldname="Banana" />
</div>
(注意'fieldname'属性) 您可以将值扫描到审核日志中,如下所示: -
var builder = new StringBuilder(
string.Format("{0}{1}{2:dd/MM/yyyy hh:mm}- (Incident saved by: {3})",
txtAuditLogReadOnly.Text,
Environment.NewLine,
DateTime.Now,
Page.User.Identity.Name));
var controls = from Control c in divContainer.Controls
select c;
foreach (var ctl in controls)
{
if (ctl is TextBox)
{
var txt = (TextBox)ctl;
if (!string.IsNullOrEmpty(txt.Text))
{
string fieldname = txt.Attributes["fieldname"];
builder.AppendFormat(" - with changes to {0}", fieldname);
}
}
}
return builder.ToString();
答案 1 :(得分:0)
一种更清晰的方式来判断每个HiddenField
的if / else-ing是否会遍历页面上的控件,检查它们的类型以及它们是否为HiddenField
的值,请执行某些操作价值。
foreach (Control ctrl in this.Controls)
{
if (ctrl is HiddenField)
{
if (!string.IsNullOrEmpty((ctrl as HiddenField).Value))
{
// do something
}
}
}