2

これは私の最初の質問です。私はほぼ毎日スタックオーバーフローに陥っていますが、自分で答えを見つけることができず、ここに投稿する必要があるのはこれが初めてです.

Ext.NetXML構成に基づいて、あらゆる種類のコントロールとそれらの任意の数を使用して、動的に(問題がある場合はVB.netで)ページを作成しています。そこで、XML のフィールドごとにコントロールを作成し、それに ID を割り当てます (ID は XML から取得されます)。クリックするとXMLを再度解析し、各フィールドのIDを取得し、このIDのコントロールを取得する「送信」ボタンがありますExt.Net.X.GetCmp. 次に、コントロールを取得したら、値を取得して、それを使用して何かを行います。コントロールタイプを除いて、すべてが魅力のように機能しFileUploadFieldます。thisによると、何らかの理由で、GetCmpでは動作しませんFileUploadField

だから、私の質問は: FileUploadFieldID に基づいてコントロールを取得する方法はありますか? そして、なぜGetCmpこの種のコントロールではうまくいかないのでしょうか?

よろしくお願いします。下手な英語で申し訳ありません。

編集:

Ext.Net を最新バージョン (2.2) に更新しました。すべてが奇妙に見えますが、機能するかどうかは問題ではありません。見た目以外に、行動に変化は見られません。GetCmp はまだ同じ結果を出しています。ところで、X.GetCmp(Of Ext.Net.FileUploadField)(ControlID) は、コントロールを作成しなくても、null ではなく FileUploadField を返します。唯一のことは、常に hasFile=false であり、ファイルバイトが空であることです。

編集2:

サンプルコードを実行しましたが、魅力的に機能します。「isUpload」が鍵だと思い始めます。私は、この {isUpload=true} をどこに、なぜ書かなければならないのかを一日中グーグルで調べていましたが、役に立つものは何も見当たりませんでした。少し説明してもらえますか?DirectMethods専用ですか?必須です?どうもありがとう!

編集3:

私は今とても愚かだと感じています。できます。JavaScript の DirectMethod 呼び出しに単純な isUpload:true を追加しました。このばかげたことを解決するのに何日もかかりました。次の人のために: あなたの isUpload ;) をチェックしてください。

4

2 に答える 2

1

だから、私の質問は: ID に基づいて FileUploadField コントロールを取得する方法はありますか?

そのコントロールを再作成するだけです。1 つの 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}

これはコンストラクタを返します。FileBytesApp 名前空間を使用していつでも ExtJSからフェッチできるはずです( BREAKING CHANGESを参照) 。

FileBytes の完成した get は次のようになります。

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