2

这是我的第一个问题。我几乎每天都在堆栈溢出,但这是我第一次自己找不到答案,不得不在这里发布。

我正在Ext.Net动态创建页面(如果重要,在 VB.net 中),基于 XML 配置,具有各种控件和任意数量的控件。因此,对于 XML 中的每个字段,我创建控件并为其分配一个 ID(ID 来自 XML)。我有一个“提交”按钮,单击该按钮后,再次解析 XML,获取每个字段的 ID,并使用Ext.Net.X.GetCmp. 然后,一旦我有了控制权,我就会得到价值并用它做一些事情。除了 control type 之外,一切都像魅力一样FileUploadField。据此,由于某种原因,不适GetCmp用于FileUploadField.

所以,我的问题是:有什么方法可以FileUploadField根据它的 ID 获取控件吗?而且,只是想知道,为什么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 ;)。

4

2 回答 2

1

所以,我的问题是:有没有办法根据它的 ID 获取 FileUploadField 控件?

仅重新创建该控件。您在一个 AJAX 请求(DirectEvent/DirectMethod)期间呈现一个控件,并且它不会在另一个 AJAX 请求期间持续存在,除非您手动重新创建它。它的行为与标准 ASP.NET 控件相同。

控件可以在 Page_Init 中重新创建,并且必须使用相同的 ID 重新创建。在这种情况下,控件的 LoadPostData 应该从 POST 集合中提取正确的值。这是一个相关的讨论

而且,只是想知道,为什么 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>
于 2013-04-26T12:32:07.857 回答
0

你可以使用简单的javascript:

var fileinput = document.getElementById("fileinput");

因为 javascript 只搜索你需要小心的 DOM。每个 Ext.Net 组件将获得一堆包装器和子组件以及“不必要的”兄弟/父/子(用于标题、标签、底部和顶部栏等..)

如果您为控件提供了 ID,您应该可以通过以下方式获取它:

App.{control-id}

这将返回构造函数。您应该能够FileBytes随时使用 App 命名空间从 ExtJS 获取(请参阅BREAKING CHANGES

FileBytes 的完成获取如下所示:

App.{control-id}.FileBytes
于 2013-04-24T14:40:20.117 回答