如何从代码隐藏

时间:2017-11-03 15:10:08

标签: c# asp.net validation contact-form

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

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

所以,我不知道将要处理什么,或者有多少表格输入。

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

  1. 添加" id"到表单提交时使用的列表
  2. 根据管理员选择的选项构建输入并添加属性
  3. 添加验证器
  4. 以下代码是将输入添加到页面的部分。这个想法很简单,管理员"创建"输入并选择他们的选项(名称,标签,占位符,只读等)

    然后,代码隐藏将采用这些选项并构建输入和相应的输入验证控件。

    我一直收到此错误

      

    无法找到控制ID' text_9d8f153'由' ControlToValidate'引用&val; 9_8d8f153'。

    的财产

    这是文件; 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>
    

    EmailFormTextBoxDisplay.ascx.cs

    using System
    ...
        protected void buildMe(object sender, EventArgs e)
        {
            HtmlGenericControl div = (HtmlGenericControl)sender;
            if (EmailForm.formProcessed)
            {
                div.Visible = false;
            }
            else
            {
                String id = inputEmailLabel.Replace(" ", "-") + "_" + randId;
                // add this input to the list
                EmailForm.inputs.Add(new String[]
                {
                    id,
                    inputType,
                    inputEmailLabel
                });
                // if label is not empty, add it
                if (inputLabel != "")
                {
                    HtmlGenericControl label = new HtmlGenericControl("label");
                    label.InnerText = inputLabel + " ";
                    label.TagName = "label";
                    div.Controls.Add(label);
                }
                // build and add the input
                HtmlInputGenericControl input = new HtmlInputGenericControl("input");
    
                // get each setting and add attributes to the input
                input.Attributes.Add("type", inputType);
                input.Attributes.Add("id", id);
                input.Attributes.Add("placeholder", inputPlaceholder);
                if (inputValue != "") input.Attributes.Add("value", inputValue);
                if (inputDisabled) input.Attributes.Add("disabled", "disabled");
                if (inputReadOnly) input.Attributes.Add("readonly", "readonly");
                if (inputRequired)
                {
                    input.Attributes.Add("required", "required");
                    AsiRequiredFieldValidator required = new AsiRequiredFieldValidator();
                    required.ControlToValidate = id;
                    required.ID = "val_" + randId;
                    required.Text = "This is Required";
                    div.Controls.Add(required);
                }
                if (inputRegEx != "" && inputRegEx != null)
                {
                    AsiRegularExpressionValidator regEx = new AsiRegularExpressionValidator();
                    regEx.ValidationExpression = inputRegEx;
                    regEx.ControlToValidate = id;
                    regEx.ID = "regExVal_" + randId;
                    regEx.Text = inputRegExMsg;
                    div.Controls.Add(regEx);
                }
    
                div.Controls.Add(input);
            }
        }
    

    我已经尝试将验证部分分解为它自己的方法,并调用第一部分(进行输入)onLoad然后添加验证器onPreRender但我得到相同的错误。

    我也尝试使用Control.AddAt(2, input)来确保<input />在验证器之前,但无济于事。

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

2 个答案:

答案 0 :(得分:1)

您需要使用aspnet生成的ID,而不是属性设置的ctl00_PlaceHolder1_myID。这是因为该ID将由aspnet客户端重命名,因此html中的实际ID可能会变成这样的HtmlInputGenericControl input = new HtmlInputGenericControl("input"); input.ID = id;

required.ControlToValidate = input.ID;

然后是Validator

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);

您也可以使用&#34;真实&#34; aspnet控件。

this

答案 1 :(得分:0)

ControlToValidate需要您要验证的控件的服务器端ID。您需要设置控件的ID,如下所示:

unless String.trim(body) == "" do
  broadcast! socket, "new_msg", %{body: body}
end

然后使用输入id进行验证:

if String.trim(body) != "" do
  broadcast! socket, "new_msg", %{body: body}
else
  broadcast! socket, "error_msg", %{body: "Body is empty"}
end