我的问题是我有一个设计师会创建一个没有任何.net控件的自定义aspx页面。我需要一种动态添加控件的方法。到目前为止,唯一类型的控件将是文本框和按钮,但文本框可以有30种不同的变体(名称,电话号码,电子邮件等)。此外,可能需要也可能不需要文本框。添加文本框后,表单将提交给数据库。
我的第一个想法是让设计师放置类似[name]的东西,然后将其替换为具有名称文本框和必填字段验证器的用户控件。为了确定是否应该启用验证器,我认为占位符可能看起来像这样,[name; val]或[name; noval]。我可以动态替换代码中的占位符,也可以设置一个工具,用户将他们的html粘贴到文本框中,然后单击一个按钮,然后吐出必要的代码来创建aspx页面。
我确信必须有一个更好的方法来做到这一点,但它是一个相当独特的问题,所以我找不到任何替代方案。有没有人有任何想法?
谢谢,
柯克
答案 0 :(得分:0)
如果您的设计师为您提供了html页面,只需创建一个新网站即可。使用Image文件夹复制和分页所有HTML页面以及项目的所有内容。然后为每个HTML页面创建一个aspx页面(具有相同的名称)复制和页面html的标签,这些标签位于aspx页面和主体之间,并粘贴HTML页面的标签,这些标签位于aspx页面之间。 现在你有了你的aspx页面,与html页面完全相同。
答案 1 :(得分:0)
听起来像是试图过度设计应该不成问题的解决方案。
正如@Alessandro在上面的评论中提到的,为什么设计师不能为您提供具有控制标记的页面?就目前而言,设计师并没有像“自定义HTML页面”那样为您提供“自定义aspx”。如果设计师承诺ASPX但只提供HTML,那么这就是业务需求中的某种误解。
但是,即使设计师只提供HTML,也应该没有问题。在最坏的情况下,您可以将服务器上所需的每个元素设置为runat="server"
以在服务器端访问它们。或者,更好的方法是简单地用相关控件的ASPX控件标记替换它们。
答案 2 :(得分:0)
编写一个简单的解析器,它将识别[...]标签并用相应的控件替换它们。它很容易做到,我经常这样做...我使用的标签通常是$$(..);但是,只要您的解析器知道您的标签,这无关紧要。
这样的解析器将包含一个可以处于两种状态的简单状态机;文本模式或标记模式。循环遍历整个页面文本,char表示char。只要您处于文本模式,就可以将每个char附加到临时缓冲区中。一旦进入标记模式,就可以使用临时缓冲区的内容创建一个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();
}