通过检查hiddenfields是否为空来添加具有不同值的字符串的最简单方法

时间:2014-01-30 23:01:27

标签: c# asp.net audit-trail hiddenfield

我正在使用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个字段可以循环播放,这就是为什么我想知道是否有更好的方法来解决这个问题...感谢任何输入,请不要粗暴对待我...... :)

2 个答案:

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