现在我有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!";
}
}
}
答案 0 :(得分:2)
您需要连接错误消息 - 如果发现错误,连接并添加新行,如果没有,只需使用新的错误消息:
if(string.IsNullOrWhiteSpace(lblError.Text))
{
lblError.Text = "Please enter last name!";
}
else
{
lblError.Text += "Please enter last name!" + Environment.NewLine;
}
以上只是一个支票的一个例子。
我建议将常用逻辑解压缩到自己的方法并重用它(例如,只需将错误消息和控件作为参数传递给。)
答案 1 :(得分:1)
你可以这样做。
添加+ =例如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!";
}
}
}
但实际上,我建议您查看使用验证控件。它们很容易添加到您的表单中。在这种情况下会帮助你
答案 2 :(得分:0)
你可以 -
lblError
控件答案 3 :(得分:0)
主要问题是你的方法抛出一个异常,这就是为什么你只得到catch块中定义的消息。我怀疑这段代码会引发错误:
dt1 = DateTime.Parse(txtStartDate.Text);
dt2 = DateTime.Parse(txtEndDate.Text);
如果作为参数传入的文本字符串不能完全解析为DateTime值,则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在需要时附加消息,然后将其应用于消息末尾的错误标签。
答案 4 :(得分:0)
检查空字符串时,最好使用String.IsNullOrEmpty。
标签,假设它是单行标签,只能显示一件事。无论何时分配Text属性,都会覆盖之前存储的任何文本。如果必须显示多个内容,则应使用显示更多文本的控件并将其附加。如果在try块中抛出异常,你只会命中你的catch块。
答案 5 :(得分:0)
一个想法是声明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;
}
并定义ValidationContext
,如下所示:
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
添加错误。)
如果您这样做,您只能在您的用户界面中添加一个using{}
,并从应用程序/库的所有部分调用ValidationContext.Current.AddError()
。