如何从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
,因为我正在进行自定义文件上传,但这并不重要,因为其他所有功能都可以工作,唯一不起作用的是这个。
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
字符串),控件现在是服务器端。