Ext.Net X.GetCmp方法不能与FileUploadField一起使用

时间:2013-04-24 11:54:14

标签: vb.net ext.net

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

我正在动态地创建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;)。

2 个答案:

答案 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