0

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

4

2 回答 2

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();
于 2014-01-30T23:40:37.043 回答
0

一个更简洁的 if/else-ingHiddenField方法是循环浏览页面上的控件,检查它们的类型,如果它们是HiddenField带有值的,则使用该值执行某些操作。

foreach (Control ctrl in this.Controls)
{
    if (ctrl is HiddenField)
    {
        if (!string.IsNullOrEmpty((ctrl as HiddenField).Value))
        {
            // do something
        }
    }
}
于 2014-01-30T23:45:32.617 回答