Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从codebehind添加输入和验证控件_C#_Asp.net_Validation_Contact Form - Fatal编程技术网

C# 如何从codebehind添加输入和验证控件

C# 如何从codebehind添加输入和验证控件,c#,asp.net,validation,contact-form,C#,Asp.net,Validation,Contact Form,我在CMS中工作,称为RiSE内置iMIS(我不推荐) 我正在构建一个插件类型的东西,它将允许程序后端的管理员构建一个联系人表单。(非常简单对吧!?!?) 所以,我不知道要处理的表单输入是什么,或者有多少 该过程适用于每个添加的输入 将其“id”添加到提交表单时使用的列表中 根据管理员选择的选项生成输入并添加属性 添加验证器 下面的代码是将输入添加到页面的代码。想法很简单,管理员“创建”输入并选择它们的选项(名称、标签、占位符、只读等) 然后,codebehind将采用这些选项并构建输入和协同绑

我在CMS中工作,称为RiSE内置iMIS(我不推荐)

我正在构建一个插件类型的东西,它将允许程序后端的管理员构建一个联系人表单。(非常简单对吧!?!?)

所以,我不知道要处理的表单输入是什么,或者有多少

该过程适用于每个添加的输入

  • 将其“id”添加到提交表单时使用的列表中
  • 根据管理员选择的选项生成输入并添加属性
  • 添加验证器
  • 下面的代码是将输入添加到页面的代码。想法很简单,管理员“创建”输入并选择它们的选项(名称、标签、占位符、只读等)

    然后,codebehind将采用这些选项并构建输入和协同绑定输入验证控件

    我一直在犯这个错误

    找不到“val_9d8f153”的“ControlToValidate”属性引用的控件id“text_9d8f153”

    这是档案; EmailFormTextBoxDisplay.ascx

    <%@ Control Language="C#" AutoEventWireup="True" CodeBehind="EmailFormTextBoxDisplay.ascx.cs" Inherits="EmailForm.EmailFormTextBoxDisplay" %>
    <%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
    <%@ Register TagPrefix="asiweb" Assembly="Asi.Web" Namespace="Asi.Web.UI.WebControls" %>
    
    <div onprerender="buildMe" runat="server"></div>
    
    我尝试将验证部分分解为它自己的方法,调用第一部分(输入)
    onLoad
    ,然后添加验证器
    onPreRender
    ,但我得到了相同的错误

    我还尝试使用
    Control.AddAt(2,输入)
    来确保
    在验证器之前,但没有效果


    如何动态构建输入和验证?

    ControlToValidate需要要验证的控件的服务器端id。您需要如下设置控件的id:

    input.ID = "MY_ID";
    
    然后使用输入id验证:

    required.ControlToValidate = input.ID;
    

    您需要使用aspnet生成的
    ID
    ,而不是属性设置的引用。这是因为该ID将由aspnet客户端重命名,因此html中的实际ID可能类似于以下内容

    HtmlInputGenericControl input = new HtmlInputGenericControl("input");
    input.ID = id;
    
    然后是验证器

    required.ControlToValidate = input.ID;
    
    您还可以使用“真正的”aspnet控件

    TextBox tb = new TextBox();
    tb.ID = "myTextBox" + i;
    
    RequiredFieldValidator val = new RequiredFieldValidator();
    val.ControlToValidate = tb.ID;
    val.ErrorMessage = "Required field";
    
    Literal lit = new Literal();
    lit.Text = "<br>";
    
    PlaceHolder1.Controls.Add(tb);
    PlaceHolder1.Controls.Add(val);
    PlaceHolder1.Controls.Add(lit);
    
    TextBox=newtextbox();
    tb.ID=“myTextBox”+i;
    RequiredFieldValidator val=新的RequiredFieldValidator();
    val.ControlToValidate=tb.ID;
    val.ErrorMessage=“必填字段”;
    Literal lit=新的Literal();
    lit.Text=“
    ”; 占位符1.控件。添加(tb); 占位符1.控件.添加(val); 占位符1.控件.添加(亮起);
    +1表示“真实”aspnet控件。ASP已经够糟糕了,上面没有垃圾。这是我的问题。我没有意识到“属性”的设置几乎是任意的。看不见的id到底有什么用???这很有效,谢谢你的例子。
    TextBox tb = new TextBox();
    tb.ID = "myTextBox" + i;
    
    RequiredFieldValidator val = new RequiredFieldValidator();
    val.ControlToValidate = tb.ID;
    val.ErrorMessage = "Required field";
    
    Literal lit = new Literal();
    lit.Text = "<br>";
    
    PlaceHolder1.Controls.Add(tb);
    PlaceHolder1.Controls.Add(val);
    PlaceHolder1.Controls.Add(lit);