如何获取标签以显示错误

本文关键字:标签 显示 错误 获取 何获取 | 更新日期: 2023-09-27 18:13:58

可能重复:
文本框验证不起作用

现在我有5个文本框,当其中任何一个字段为空时,它会将框变为黄色,并在我的标签中输出名为"lblError"的语句,下面的错误是"请输入有效数据!"这列在我的catch语句中。我希望lblError输出我为每个文本框列出的文本语句。因此,如果名字和姓氏为空,lblError将同时输出这两条消息。我是C#的新手,所以这对我来说有点困惑。

public partial class frmPersonnel : System.Web.UI.Page
{
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        try
        {
            DateTime dt1;
            DateTime dt2;
            if (txtFirstName.Text == "")
            {
                txtFirstName.BackColor = System.Drawing.Color.Yellow;
                lblError.Text = "Please enter first name";
            }
            if (txtLastName.Text == "")
            {
                txtLastName.BackColor = System.Drawing.Color.Yellow;
                lblError.Text = "Please enter last name!";
            }
            if (txtPayRate.Text == "")
            {
                txtPayRate.BackColor = System.Drawing.Color.Yellow;
                lblError.Text = "Please enter pay rate!";
            }
            if (txtStartDate.Text == "")
            {
                txtStartDate.BackColor = System.Drawing.Color.Yellow;
                lblError.Text = "Please enter start date!";
            }
            if (txtEndDate.Text == "")
            {
                txtEndDate.BackColor = System.Drawing.Color.Yellow;
                lblError.Text = "Please enter end date!";
            }
            dt1 = DateTime.Parse(txtStartDate.Text);
            dt2 = DateTime.Parse(txtEndDate.Text);

            if (DateTime.Compare(dt1, dt2) > 0)
            {
                txtStartDate.BackColor = System.Drawing.Color.Yellow;
                txtEndDate.BackColor = System.Drawing.Color.Yellow;
                lblError.Text = "Start Date must not be greater than End Date.";
            }
            else
            {
                Session["txtFirstName"] = txtFirstName.Text;
                Session["txtLastName"] = txtLastName.Text;
                Session["txtPayRate"] = txtPayRate.Text;
                Session["txtStartDate"] = txtStartDate.Text;
                Session["txtEndDate"] = txtEndDate.Text;
                Server.Transfer("frmPersonalVerified.aspx");
            }
        }
        catch (Exception)
        {
            lblError.Text = "Please enter valid data!";
        }
    }
}

如何获取标签以显示错误

您将需要连接错误消息-如果发现错误,则连接并添加新行,如果没有,则只使用新的错误消息:

if(string.IsNullOrWhiteSpace(lblError.Text))
{
   lblError.Text = "Please enter last name!";
}
else
{
   lblError.Text += "Please enter last name!" + Environment.NewLine;
}

以上只是一个检查的示例。

我建议将公共逻辑提取到自己的方法中并重用它(例如,只需将错误消息和要检查的控件作为参数传递(。

您可以这样做。

添加+=例如lblError.Text += "Please enter first name ";这将附加到文本框中已有的文本中。

public partial class frmPersonnel : System.Web.UI.Page
{
  protected void btnSubmit_Click(object sender, EventArgs e)
  {
    try
    {
        DateTime dt1;
        DateTime dt2;
        // Add this 
        lblError.Text = "";
        if (txtFirstName.Text == "")
        {
            txtFirstName.BackColor = System.Drawing.Color.Yellow;
            lblError.Text += "Please enter first name ";
        }
        if (txtLastName.Text == "")
        {
            txtLastName.BackColor = System.Drawing.Color.Yellow;
            lblError.Text += "Please enter last name! ";
        }
        if (txtPayRate.Text == "")
        {
            txtPayRate.BackColor = System.Drawing.Color.Yellow;
            lblError.Text += "Please enter pay rate! ";
        }
        if (txtStartDate.Text == "")
        {
            txtStartDate.BackColor = System.Drawing.Color.Yellow;
            lblError.Text += "Please enter start date! ";
        }
        if (txtEndDate.Text == "")
        {
            txtEndDate.BackColor = System.Drawing.Color.Yellow;
            lblError.Text += "Please enter end date! ";
        }
        dt1 = DateTime.Parse(txtStartDate.Text);
        dt2 = DateTime.Parse(txtEndDate.Text);

        if (DateTime.Compare(dt1, dt2) > 0)
        {
            txtStartDate.BackColor = System.Drawing.Color.Yellow;
            txtEndDate.BackColor = System.Drawing.Color.Yellow;
            lblError.Text += "Start Date must not be greater than End Date. ";
        }
        else
        {
            Session["txtFirstName"] = txtFirstName.Text;
            Session["txtLastName"] = txtLastName.Text;
            Session["txtPayRate"] = txtPayRate.Text;
            Session["txtStartDate"] = txtStartDate.Text;
            Session["txtEndDate"] = txtEndDate.Text;
            Server.Transfer("frmPersonalVerified.aspx");
        }
    }
    catch (Exception)
    {
        lblError.Text = "Please enter valid data!";
    }
  }
}

实际上,我建议您考虑使用验证控件。它们很容易添加到您的表单中。在这种情况下,

会帮助您

您可以-

  • 将每个无效字段的错误消息存储在StringBuilder中
  • 如果StringBuilder在过程结束时包含任何内容将收集到的错误消息输出到lblError控件

在检查空字符串时,最好使用string。IsNullOrEmpty。

假设标签是单行标签,那么它只能显示一个内容。无论何时指定"文本"属性,之前存储的任何文本都将被覆盖。如果你必须显示多个内容,你应该使用一个显示更多文本并附加它的控件。只有在try块中抛出异常时,你才会碰到catch块。

一个想法是声明一个IDisposable类来收集所有验证错误
这个类负责收集错误消息,并在处理上下文时抛出它们(如果有的话(。(即,当使用达到关闭支架时(

try
{
    using (var cx = new ValidationContext())
    {
        if (this) cx.AddError("Please provide a value for ...");
        if (that) cx.AddError("Please provide a value for ...");
    }
}
catch (Exception ex)
{
    lblError.Text = ex.Message;
}

并将CCD_ 4定义如下:

public class ValidationContext : IDisposable
{
    StringBuilder Builder { get; set; }
    public ValidationContext()
    {
        Builder = new StringBuilder();
    }
    public void AddError(string message) { Builder.AppendLine(message); }
    public void Dispose()
    {
        var total = Builder.ToString().Trim();
        if (total.Length > 0)
        {
            throw new Exception(total);
        }
    }
}

这是这个概念的最简单实现,您可以向它添加更多功能,以支持从代码中的任何位置(甚至嵌套方法(向ValidationContext.Current添加错误
如果这样做,您将只能向UI中添加一个using{},并从应用程序/库的所有部分调用ValidationContext.Current.AddError()

主要问题是您的方法抛出了一个异常,这就是为什么您只得到catch块中定义的消息。我怀疑错误是由以下代码引发的:

dt1 = DateTime.Parse(txtStartDate.Text);
dt2 = DateTime.Parse(txtEndDate.Text);

日期时间。如果作为参数传入的文本字符串没有完全按照DateTime值进行解析,则Parse((将引发异常
解决此问题的方法可能是使用DateTime。TryParse((方法,它不会引发异常:

DateTime dt1 = DateTime.MinValue;
DateTime dt2 = DateTime.MinValue;
if (DateTime.TryParse(txtStartDate.Text, out dt1) &&
    DateTime.TryParse(txtEndDate.Text, out dt2))
{
    if (DateTime.Compare(dt1, dt2) > 0) 
    {
     ....
    }
    else
    {
     ....
    }
}
else
{
     // set error stating date time values are not in a parsable format
}

你遇到的第二个问题是,你每次都用以下代码覆盖错误标签:

lblError.Text = "Please enter first name";

避免这种情况的一种方法是使用:

lblError.Text += "Please enter first name<br />";

或者,您可以使用StringBuilder根据需要附加消息,然后将其应用于消息末尾的错误标签。