我希望有人可以提供帮助。我到处检查了这个答案,找不到任何东西。我无法得到我的第一个if语句“fire”。
在我的表单中,我有一个文本框供用户输入数量,我正在尝试将其验证为150,当它是“Foil”和“Standard”或“Printed”和“Mini”的产品时它的子类别名称。如果它没有这4个单词中的任何一个,那么最小数量应该默认为250.这是我的“数量”文本框的代码:
<asp:TextBox ID="txtQuantity" runat="server" Text="Quantity" Width="300" />
<asp:RequiredFieldValidator ID="rfvQuantity" runat="server" ControlToValidate="txtQuantity" ErrorMessage="Quantity Required" Display="None" ValidationGroup="Quote" />
<asp:CompareValidator ID="cmvQuantity" runat="server" ControlToValidate="txtQuantity" ErrorMessage="Insufficient Quantity" Display="None" ValueToCompare="250" Operator="GreaterThanEqual" Type="Integer" ValidationGroup="Quote" />
<asp:CompareValidator ID="cmvQuantityText" runat="server" ControlToValidate="txtQuantity" ErrorMessage="Quantity Required" Display="None" Operator="DataTypeCheck" Type="Integer" ValidationGroup="Quote" />
这是背后的代码:
protected void rptProduct_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Foil") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Standard") ? "150" : "250";
((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Printed") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Mini") ? "150" : "250";
}
}
出于某种原因,它似乎只适用于最后一个条件,而不是第一个条件,即使我切换条件语句的位置,它仍然只适用于最后一个语句而不是第一个语句。
所以我认为这是一个语义问题?
任何帮助将不胜感激!!
谢谢!
答案 0 :(得分:1)
问题我看到你为同一个比较验证器控件ValueToCompare
设置cmvQuantity
两次,这是完全错误的方式,因为最后执行的最后一个将是对属性值的最终更改所以以下是适用于您的情况的实现。
protected void rptProduct_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Product productInstance = e.Item.DataItem as Product; //safely type cast
CompareValidator cmvQuantity = e.Item.FindControl("cmvQuantity") as CompareValidator; //safely type cast
if (cmvQuantity != null && productInstance != null) //check if type cast suceeded and/or control was found.
{
if((productInstance.SubCategory.Category.Name.Contains("Foil") && productInstance.SubCategory.Name.Contains("Standard")) ||
(productInstance.SubCategory.Category.Name.Contains("Printed") && productInstance.SubCategory.Name.Contains("Mini"))
{
cmvQuantity.ValueToCompare = "150";
}
else
{
cmvQuantity.ValueToCompare = "250";
}
}
}
}
可能对您有所帮助的一些要点
尝试从页面中查找对象并将其取在变量中,而不是在每个新行中查找。例如,而不是如下所示:
public void Method()
{
((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = "Test value";
((CompareValidator)e.Item.FindControl("cmvQuantity")).ControlToValidate = "txtControlId";
}
将其实施为:
public void Method()
{
CompareValidator cmvQuantity = e.Item.FindControl("cmvQuantity") as CompareValidator;
if (cmvQuantity != null)
{
cmvQuantity.ValueToCompare = "Test value";
cmvQuantity.ControlToValidate = "txtControlId";
}
}
对于相同的代码块,不要在If-Else中添加每个新内容。例如
if (test == 1)
{
txtControl.Text = "150";
}
else if (test == 2)
{
txtControl.Text = "150";
}
else
{
txtControl.Text = "250";
}
将其实施为:
if (test == 1 || test == 2)
{
txtControl.Text = "150";
}
else
{
txtControl.Text = "250";
}
答案 1 :(得分:0)
这里你有条件,所以我建议你区分条件,
if (e.Item.ItemType == ListItemType.Item)
{
((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Foil") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Standard") ? "150" : "250";
((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Printed") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Mini") ? "150" : "250";
}
else if (e.Item.ItemType == ListItemType.AlternatingItem)
{
((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Foil") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Standard") ? "150" : "250";
((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Printed") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Mini") ? "150" : "250";
}
并检查其是否正常工作。 我还没有测试过。
答案 2 :(得分:0)
如果您考虑代码的作用,那就应该是显而易见的。
首先,你这样做:
((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Foil") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Standard") ? "150" : "250";
然后,没有进一步的条件检查你这样做:
((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Printed") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Mini") ? "150" : "250";
因此,如果(Product)e.Item.DataItem
包含 Foil 和标准,则第一行会将ValueToCompare
设置为150。
但在下一行,这会立即更改回250 ,除非<{em} (Product)e.Item.DataItem
还包含Printed
和Mini
。
尝试将代码更改为:
protected void rptProduct_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var validator = e.Item.FindControl("cmvQuantity") as CompareValidator;
var product = (Product)e.Item.DataItem;
if (validator != null)
{
if (product.SubCategory.Category.Name.Contains("Foil") && product.SubCategory.Category.Name.Contains("Standard"))
{
validator.ValueToCompare = "150";
}
else if (product.SubCategory.Category.Name.Contains("Printed") && product.SubCategory.Category.Name.Contains("Mini"))
{
validator.ValueToCompare = "150";
}
else
{
validator.ValueToCompare = "250";
}
}
}
}