【问题标题】:How to Validate a dynamic Textbox control如何验证动态文本框控件
【发布时间】:2015-11-06 04:16:04
【问题描述】:

我有一个动态创建的文本框(例如)

for(int i = 0; i < 4; i++)
{
    TextBox txtControl = new TextBox();
    txtControl.ID = "txt" + i;
    txtControl.AutoPostBack = true;
    txtControl.TextChanged += txtControl_TextChanged;
} 

我想验证文本框输入始终是一个整数,所以我生成了TextChanged 事件处理程序,其中我有CompareValidator,如下所示

void txtControl_TextChanged(object sender, EventArgs e)
{
    Log = new StringBuilder();
    CompareValidator validateTextBox = new CompareValidator();
    validateTextBox.Operator = ValidationCompareOperator.DataTypeCheck;
    validateTextBox.Type = ValidationDataType.Integer;
    validateTextBox.ControlToValidate = "txt1";
    string Message = validateTextBoxNumber.ErrorMessage;
 }

事件 txtControl_TextChanged 正在触发,但如果传递了一个非整数,它不会抛出错误消息。

我的问题是

  1. 如何验证输入的输入是整数还是非整数
  2. 在示例中,我直接给出了文本框 id,我该如何传递它 动态

【问题讨论】:

  • 客户端验证还是服务器端?
  • 那为什么jquery标签在这里..它没用!
  • 从您的代码中,我看到您的 CompareValidator 对象是 validateTextBoxNumber 但您使用的任何地方 validateTextBox 是不是错字?
  • 对不起,这只是一个错误,现在看看

标签: c# asp.net validation dynamic


【解决方案1】:

请尝试这种方式: 1)在您的页面中编写以下脚本功能,如下所示

$(".numeric").bind("keypress", function (event) {
        if (event.charCode != 0) {
            var regex = new RegExp("^[0-9]+$");
            var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);
            if (!regex.test(key)) {
                event.preventDefault();
                return false;
            }
        }
    });

步骤 2) 为文本框添加 css 类。喜欢

<input type="text" id="textboxid" class="numeric" />

所以这将只允许数值

【讨论】:

    【解决方案2】:

    现在,因为您已将 jQuery 标记为此问题,所以我有一个 jQuery 解决您的问题。

    我正在验证文本框是否仅用于整数输入。

    改变你后面的代码如下:

    for(int i = 0; i < 4; i++)
    {
        TextBox txtControl = new TextBox();
        txtControl.ID = "txt" + i;
        txtControl.cssClass = "validate"
    } 
    

    将以下脚本标签添加到您的前端:

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $(".validate").keypress(function (e) {
                if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57 || e.which == 46)) {
                    return false;
                }
            });
        });
    </script>
    

    小提琴:http://jsfiddle.net/38nn3rdx/1/ 上面的函数不允许文本输入。

    【讨论】:

    • 从您的文本框中删除文本更改事件。同时删除 autopostback=true。您不需要对我的解决方案进行回发。只需在前端文件的脚本标签中添加上述代码即可。
    • 验证来自代码后面的整数值不会是一种有效的做法,因为这将在您每次更改文本时进行回发。客户端脚本是验证的最佳解决方案
    • 我正在生成背后的控件代码,我的textbox ids 各不相同。所以必须通过发送文本框 id @Rajan Goswami 来动态调用
    • 没问题...为所有动态创建的文本框分配一个公共类。您可以使用txt.CssClass = "validate" 来执行此操作。其余的将由我修改后的代码处理。请验证。
    • 您能否提供示例代码或小提琴 bcoz 我已经尝试过但无法正常工作@Rajan Goswami
    【解决方案3】:

    如果客户端验证足够,您可以使用 javascript 处理验证。或者不使用compareValidator 的服务器端验证,如下所示。

    void txtControl_TextChanged(object sender, EventArgs e)
    {
        TextBox txtBox = sender as  TextBox; 
        if(!string.IsNullOrEmpty(txtBox.Text) && txtBox.Text.All(Char.IsDigit))
        {
            //Throw error message
        }
    }
    

    更新:

    由于txtControl_TextChanged是为每个动态TextBox注册的事件,当相应事件发生时会触发。因此,从sender,我们可以轻松地验证 sn-p 中提到的文本框。即,TextBox txtBox = sender as TextBox;

    你也可以使用自己的方法,就像类似的方式:

    void txtControl_TextChanged(object sender, EventArgs e)
    {
        Log = new StringBuilder();
        TextBox txtBox = sender as  TextBox; 
        CompareValidator validateTextBox = new CompareValidator();
        validateTextBox.Operator = ValidationCompareOperator.DataTypeCheck;
        validateTextBox.Type = ValidationDataType.Integer;
        validateTextBox.ControlToValidate = txtBox ;
        string Message = validateTextBoxNumber.ErrorMessage;
     }
    

    【讨论】:

    • 我希望txtControl 是动态生成的,我怎样才能得到那个特定的texbox @un-lucky
    • 我什至想接受,即使它是dot(.),因为在不允许之前我没有解决,应该怎么做才能接受dot@un-lucky
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2021-10-11
    • 2010-12-27
    • 2011-05-08
    • 2011-02-10
    • 2018-03-23
    相关资源
    最近更新 更多