这是我的第一个问题。我几乎每天都在堆栈溢出,但这是我第一次无法自己找到答案而必须在这里发布。
我正在动态地创建Ext.Net
页面(在VB.net中,如果重要的话),基于XML配置,包含所有类型的控件和任意数量的控件。因此,对于XML中的每个字段,我创建控件并为其分配ID(ID来自XML)。我有一个“提交”按钮,单击该按钮后,再次解析XML,获取每个字段的ID,并使用Ext.Net.X.GetCmp
获取此ID的控件。然后,一旦我掌握了控制权,我就会得到价值并用它来做一些事情。除了控件类型FileUploadField
之外,一切都像魅力一样。根据{{3}},由于某些原因,GetCmp
不适用于FileUploadField
。
所以,我的问题是:有没有办法根据它的ID获得FileUploadField
控件?并且,只是要知道,为什么GetCmp
不适用于这种控制?
非常感谢你,对不起我的英语不好。
修改
好的,我已将Ext.Net更新到最新版本(2.2)。现在一切看起来都很奇怪,但如果有效则无所谓。除了外观,我没有看到任何行为的变化。 GetCmp仍然给我一样的。顺便说一句,X.GetCmp(Of Ext.Net.FileUploadField)(ControlID)给了我一个FileUploadField,而不是null,即使我没有创建控件。唯一的问题是,hasFile = false总是,文件字节是空的。
编辑2:
我已经运行了您的示例代码,它就像一个魅力。我开始认为“isUpload”是关键。我一直在谷歌搜索,试图看看我在哪里以及为什么要写这个{isUpload = true},但我没有看到任何有用的东西。你能解释一下吗?仅适用于DirectMethods?是强制性的?非常感谢!
编辑3:
我觉得现在太傻了。有用。刚刚在javascript中的DirectMethod调用中添加了一个简单的isUpload:true。这么多天来解决这个愚蠢的事情。对于下一个人:检查你的isUpload;)。
答案 0 :(得分:1)
所以,我的问题是:有没有办法根据它的ID获取FileUploadField控件?
仅重新创建该控件。您在一个AJAX请求(DirectEvent / DirectMethod)期间呈现控件,并且在另一个AJAX请求期间它不会持久存在,除非您手动重新创建它。它的行为与标准ASP.NET控件相同。
可以在Page_Init中重新创建控件,并且必须使用相同的ID重新创建。在这种情况下,控件的LoadPostData应该从POST集合中提取正确的值。 Here is a related discussion
而且,只是要知道,为什么GetCmp无法使用这种控件?
它在Ext.NET v1中不起作用,但适用于Ext.NET v2。以下是一个示例。
但是,它只是从POST中提取文件。 X.GetCmp<>()返回一个代理控件,它不是一个真正的控件。它只是一种方便的方法来提取动态渲染控件的POST值,并且还更新客户端上的控件(更改其属性并调用其方法)。
<%@ Page Language="C#" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<script runat="server">
protected void RenderFileUploadField(object sender, DirectEventArgs e)
{
FileUploadField fileUploadField = new FileUploadField()
{
ID = "FileUploadField1",
Width = 300,
Listeners =
{
Change =
{
Handler = @"App.direct.GetFileName(this.id, {
isUpload : true
});"
}
}
};
this.Form.Controls.Add(fileUploadField);
fileUploadField.Render();
}
[DirectMethod]
public void GetFileName(string id)
{
X.Msg.Alert("FileName", X.GetCmp<FileUploadField>("FileUploadField1").PostedFile.FileName).Show();
}
</script>
<!DOCTYPE html>
<html>
<head runat="server">
<title>Ext.NET v2 Example</title>
</head>
<body>
<form runat="server">
<ext:ResourceManager runat="server" />
<ext:Button
runat="server"
Text="Create a FileUploadField"
OnDirectClick="RenderFileUploadField" />
</form>
</body>
</html>
答案 1 :(得分:0)
你可以使用简单的javascript:
var fileinput = document.getElementById("fileinput");
因为javascript只搜索你需要小心的DOM。每个Ext.Net组件将获得一堆包装器和子组件以及“不必要的”兄弟/父/子(用于标题,标签,底栏和顶栏等等)。
如果您已为控件提供了ID,则应该可以通过以下方式获取它:
App.{control-id}
这将返回构造函数。您应该能够使用App命名空间随时从ExtJS获取FileBytes
(请参阅BREAKING CHANGES)
FileBytes的完成获取将如下所示:
App.{control-id}.FileBytes