我正在使用Asp.Net 2.0。我有一个场景,我需要检查两个范围中的任何一个的用户输入。对于例如我需要检查100-200或500-600范围内的文本框值。我知道我可以将2个Asp.Net RangeValidators连接到TextBox,但是如果你愿意,那将尝试针对两个范围和AND条件验证输入。 CustomValidator是一个选项,但我如何从服务器端传递2个范围值。是否可以扩展RangeValidator来解决这个特殊问题?
[更新] 对不起,我没有提到这一点,对我来说问题是范围可能会有所不同。此外,页面中的不同控件将根据某些条件具有不同的范围。我知道我可以在一些js变量或隐藏的输入元素中保存这些值,但它看起来不会很优雅。
答案 0 :(得分:4)
CustomValidator应该可以工作。我不确定你的意思是“从服务器端传递2个范围值”。您可以使用如下验证方法在服务器端验证它:
void ValidateRange(object sender, ServerValidateEventArgs e)
{
int input;
bool parseOk = int.TryParse(e.Value, out input);
e.IsValid = parseOk &&
((input >= 100 || input <= 200) ||
(input >= 500 || input <= 600));
}
然后,您需要将CustomValidator的OnServerValidate属性设置为“ValidateRange”,或者您碰巧调用它的任何内容。
这是你想要的事吗?
答案 1 :(得分:1)
您可以使用RegularExpressionValidator并将ValidationExpression属性设置为
编辑:(哎呀,650和201等对旧模式有效)
^(1\d{2}|200|5\d{2}|600)$
这将测试输入的文本为100-200和500-600。
答案 2 :(得分:1)
我不相信使用标准的RangeValidator控件是可行的。
我做了一些搜索,我相信您最好的解决方案是创建自己的CustomValidator控件,您可以将其包含在项目中以处理此场景。
http://www.dotnetjunkies.ddj.com/Article/592CE980-FB7E-4DF7-9AC1-FDD572776680.dcik
只要您正确引用它,就不必编译它只是为了在项目中使用它。
答案 3 :(得分:0)
我扩展了BaseValidator来实现这一目标。一旦了解了Validators的工作原理,它就相当简单。我已经包含了一个粗略的代码版本来演示它是如何完成的。请注意,它是根据我的问题量身定制的(比如int应该始终是&gt; 0)但你可以轻松扩展它。
public class RangeValidatorEx : BaseValidator
{
protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
if (base.RenderUplevel)
{
string clientId = this.ClientID;
// The attribute evaluation funciton holds the name of client-side js function.
Page.ClientScript.RegisterExpandoAttribute(clientId, "evaluationfunction", "RangeValidatorEx");
Page.ClientScript.RegisterExpandoAttribute(clientId, "Range1High", this.Range1High.ToString());
Page.ClientScript.RegisterExpandoAttribute(clientId, "Range2High", this.Range2High.ToString());
Page.ClientScript.RegisterExpandoAttribute(clientId, "Range1Low", this.Range1Low.ToString());
Page.ClientScript.RegisterExpandoAttribute(clientId, "Range2Low", this.Range2Low.ToString());
}
}
// Will be invoked to validate the parameters
protected override bool ControlPropertiesValid()
{
if ((Range1High <= 0) || (this.Range1Low <= 0) || (this.Range2High <= 0) || (this.Range2Low <= 0))
throw new HttpException("The range values cannot be less than zero");
return base.ControlPropertiesValid();
}
// used to validation on server-side
protected override bool EvaluateIsValid()
{
int code;
if (!Int32.TryParse(base.GetControlValidationValue(ControlToValidate), out code))
return false;
if ((code < this.Range1High && code > this.Range1Low) || (code < this.Range2High && code > this.Range2Low))
return true;
else
return false;
}
// inject the client-side script to page
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (base.RenderUplevel)
{
this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "RangeValidatorEx", RangeValidatorExJs(),true);
}
}
string RangeValidatorExJs()
{
string js;
// the validator will be rendered as a SPAN tag on the client-side and it will passed to the validation function.
js = "function RangeValidatorEx(val){ "
+ " var code=document.getElementById(val.controltovalidate).value; "
+ " if ((code < rangeValidatorCtrl.Range1High && code > rangeValidatorCtrl.Range1Low ) || (code < rangeValidatorCtrl.Range2High && code > rangeValidatorCtrl.Range2Low)) return true; else return false;}";
return js;
}
public int Range1Low
{
get {
object obj2 = this.ViewState["Range1Low"];
if (obj2 != null)
return System.Convert.ToInt32(obj2);
return 0;
}
set { this.ViewState["Range1Low"] = value; }
}
public int Range1High
{
get
{
object obj2 = this.ViewState["Range1High"];
if (obj2 != null)
return System.Convert.ToInt32(obj2);
return 0;
}
set { this.ViewState["Range1High"] = value; }
}
public int Range2Low
{
get
{
object obj2 = this.ViewState["Range2Low"];
if (obj2 != null)
return System.Convert.ToInt32(obj2);
return 0;
}
set { this.ViewState["Range2Low"] = value; }
}
public int Range2High
{
get
{
object obj2 = this.ViewState["Range2High"];
if (obj2 != null)
return System.Convert.ToInt32(obj2);
return 0;
}
set { this.ViewState["Range2High"] = value; }
}
}