Asp.net动态地添加用户控件并定位它们

本文关键字:定位 控件 用户 net 动态 添加 Asp | 更新日期: 2023-09-27 17:48:59

我的问题是,我有一个设计器,将创建一个自定义aspx页面,但没有任何。net控件。我需要一种动态添加控件的方法。到目前为止,唯一的控件类型是文本框和按钮,但文本框可以有30种变体(姓名、电话号码、电子邮件等)。此外,文本框可能需要,也可能不需要。一旦添加了文本框,表单将被提交到数据库。

我的第一个想法是让设计师放置像[name]这样的东西,然后用一个用户控件替换它,这个用户控件有一个名称文本框和一个必需的字段验证器。为了确定是否应该启用验证器,我认为占位符可以像这样,[name;val]或[name;noval]。我可以动态地替换代码中的占位符,或者设置一个工具,用户可以将他们的html粘贴到一个文本框中,然后单击一个按钮,然后吐出必要的代码来创建aspx页面。

我相信一定有更好的方法来做到这一点,但这是一个相当独特的问题,所以我还没能找到任何替代方案。有人有什么想法吗?

谢谢,柯克

Asp.net动态地添加用户控件并定位它们

如果你的设计师给你html页面,就创建一个新的网站。复制和页面所有的HTML页面与图像文件夹和一切到您的项目。然后为每个HTML页面创建一个aspx页面,(以相同的名称)复制和页面之间的HTML的标签到aspx页面的和主体复制和粘贴HTML页面的标签之间到aspx页面的。现在你有了你的aspx页面,和html页面完全一样。

听起来像是试图过度设计应该是无关紧要的解决方案。

正如@Alessandro在上面的评论中提到的,为什么设计人员不能为您提供具有控件标记的页面?就目前而言,设计师提供给您的不是"自定义aspx",而是"自定义html页面"。如果设计师承诺ASPX,但只交付HTML,这是对业务需求的误解。

然而,即使设计师正确地只提供HTML,也不应该有问题。在最坏的情况下,您可以将服务器上需要的每个元素设置为runat="server",以便在服务器端访问它们。或者,可能更好的是,将它们简单地替换为相关控件的ASPX控件标记。

编写一个简单的解析器来识别[…]标记,并用相应的控件替换它们。这很容易做到,我经常这样做……我使用的标签通常是$$(..);不过,只要你的解析器知道你的标签,那就没关系了。

这样的解析器将由一个可以处于两种状态的简单状态机组成;文本模式或标签模式。循环遍历整个页面文本,一个字符接一个字符。只要处于文本模式,就会不断将每个字符追加到临时缓冲区中。一旦进入标记模式,就用临时缓冲区的内容创建一个LiteralControl,并将其添加到Control-tree的底部,然后清空缓冲区。

现在,您仍然继续向缓冲区中添加每个字符,但是当您再次进入文本模式时,您将分析缓冲区的内容并创建正确的控件—可能是一个简单的switch case语句。将控件添加到控件树的底部,并继续循环其余字符直到您读取末尾,并在文本模式和标记模式之间来回切换,添加LiteralControls和具体控件。

解析器的简单示例…在记事本上写了4分钟,但你应该明白了。

foreach (var c in text)
{
   buffer.Append(c);
   if (c== '[' && mode == Text) 
   { 
      mode = Tag;
      Controls.Add(new LiteralControl(buffer));
      buffer.Clear();
   }
   if (c == ']' && mode == Tag) 
   {   
      mode = Text;
      switch (buffer)
      {
         case "[name]": Controls.Add(new NameControl());
         ... the rest of possible tags
      }
      buffer.Clear();
}