2

Scriptcontrol でクライアント側とサーバー側のプロパティをバインドすることは可能ですか?

上記のように機能させることはできません-scriptcontrolが宣言されているプロパティを設定すると、最初に設定されますが、後で変更すると、以前と同じです...

編集: ASP.NET アプリケーションで長いポストバックのために ProgressBar を実行しようとしています。多くのオプションを試しましたが、どれもうまくいきません...コードビハインドで進行状況の値を設定し、長いタスクのポストバック中にビューで更新したいと考えています。

ScriptControl のコード: C#:

public class ProgressBar : ScriptControl
{
    private const string ProgressBarType = "ProgressBarNamespace.ProgressBar";
    public int Value { get; set; }
    public int Maximum { get; set; }

    protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        this.Value = 100;
        this.Maximum = 90;
        var descriptor = new ScriptControlDescriptor(ProgressBarType, this.ClientID);

        descriptor.AddProperty("value", this.Value);
        descriptor.AddProperty("maximum", this.Maximum);

        yield return descriptor;
    }

    protected override IEnumerable<ScriptReference> GetScriptReferences()
    {
        yield return new ScriptReference("ProgressBar.cs.js");          
    }
}

Javascript:

Type.registerNamespace("ProgressBarNamespace");

ProgressBarNamespace.ProgressBar = function(element) {
    ProgressBarNamespace.ProgressBar.initializeBase(this, [element]);
    this._value = 0;
    this._maximum = 100;
};

ProgressBarNamespace.ProgressBar.prototype = {
    initialize: function () {
        ProgressBarNamespace.ProgressBar.callBaseMethod(this, "initialize");
        this._element.Value = this._value;
        this._element.Maximum = this._maximum;

        this._element.show = function () {
            alert(this.Value);
        };
    },
    dispose: function () {
        ProgressBarNamespace.ProgressBar.callBaseMethod(this, "dispose");
    },
    get_value: function () {
        return this._value;
    },
    set_value: function (value) {
        if (this._value !== value) {
            this._value = value;
            this.raisePropertyChanged("value");
        }
    },
    get_maximum: function () {
        return this._maximum;
    },
    set_maximum: function (value) {
        if (this._maximum !== value) {
            this._maximum = value;
            this.raisePropertyChanged("maximum");
        }
    }
};

ProgressBarNamespace.ProgressBar.registerClass("ProgressBarNamespace.ProgressBar", Sys.UI.Control);
if (typeof (Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

このプログレスバーを実装する方法に感謝します...

4

1 に答える 1

1

個人的には、隠しフィールドを使用してこれを行うことがよくあります。非表示のフィールドは安全ではなく、実際には値を非表示にするわけではなく、単に表示しないだけなので、他の欠点がある可能性があることに注意してください。

ASPX マークアップ

<asp:HiddenField ID="hiddenRequest" runat="server" ClientIDMode="Static" />

ASPX.CS コードビハインド

    public string HiddenRequest
    {
        set
        {
            hiddenRequest.Value = value;
        }
        get
        {
            return hiddenRequest.Value;
        }
    }

ページ JAVASCRIPT (jQuery を使用)

$('#hiddenRequest').val('MyResult');

このようにして、1 つの変数を使用して同じフィールドにアクセスし、クライアント側とサーバー側の両方からアクセスできます。

于 2012-05-14T07:47:01.477 に答える