如何从Literal中获取输入元素

本文关键字:获取 输入 元素 Literal | 更新日期: 2023-09-27 18:25:22

在服务器端,我创建了一个文本,其文本设置为具有runat = 'server'属性的输入类型文件元素,模式设置为passThrough并将其附加到div。文本和输入元素都有自己的唯一id。我的问题是试图从div标记中获取该输入元素。我可以通过编程获得文本,但文本不包含任何控件,文本值具有我需要的输入元素。我试着寻找它自己的输入元素,结果一直为null。我已经检查了页面,我看到了带有runat='server'的输入元素,但我无法获得它。我需要能够获得这个输入元素才能上传它的文件。

这就是我迄今为止所尝试的:

客户端:

<div runat="server" id="docRequeridosMainDiv" style="display: table; 
width: 60%; text-align: right">
            <%-- Control set on server side --%>
</div>

服务器端:(测试页面加载事件)

//Attach inivisible input type file
 uploadLit.Text += string.Format(@"<div><input type='file' id='{0}File' runat = 'server' style='display: none;' 
     onchange='" + docsRequeridos.ElementAt(i).Nombre + @"FileSelected()' /></div>", lbl.Text);
uploadLit.ID = lbl.Text + "FileLit";
docRequeridosMainDiv.Controls.Add(uploadLit);
//var lit = (Literal)docRequeridosMainDiv.FindControl(uploadLit.ID);
var lit = (HtmlGenericControl)docRequeridosMainDiv.FindControl(lbl.Text +"File");

忽略附加到输入的事件,这是有效的。

我调试了带注释的lit,控件集合上有0,但文本有输入。第二个点亮的是返回一个空值。

尝试在单击事件中使用相同的Findcontrol行获取它,但结果仍然相同。没有控件的文字。

如果你想知道为什么输入是display:none,因为我正在进行自定义文件上传,但这并不重要,因为其他所有功能都可以工作,唯一不起作用的是这个。

如何从Literal中获取输入元素

FindControl()将只找到服务器控件。将html控件(以runat="server"作为字符串)添加到Literal中不会使这些控件服务于。但你可以使用HtmlInputFile来实现同样的效果,比如:

var fileInput = new HtmlFileInput
{
    ID = lbl.Text + "File"
};
fileInput.Attributes["onchange"] = docsRequeridos.ElementAt(i).Nombre + "FileSelected()";
fileInput.Attributes["style"] = "display:none";
docRequeridosMainDiv.Controls.Add(fileInput);

现在,你可以找到这样的控制:

var foundFileInput = docRequeridosMainDiv.FindControl(lbl.Text +"File") as HtmlFileInput;

如果你想用div包装这个文件输入,你需要制作另一个HtmlGenericControl并将该fileInput添加到其中;像这样:

var myDiv = new HtmlGenericControl("div")
{
    ID = "FileUploadContainer"
};
myDiv.Controls.Add(fileInput);
docRequeridosMainDiv.Controls.Add(myDiv); // Add myDiv instead of fileInput

这将完全生成您想要的html,但只是通过编程(不使用Literal字符串),控件现在是服务器端