6

この autosuggest プラグインを使用しています: http://aehlke.github.com/tag-it/

データベースからアイテムの配列を取得しています (現在は単なる配列です)。リストには ID とタイトルが含まれます。フォームを送信するときに、ID とタイトルの両方を取得したいと考えています。今は称号しか取れません。両方の値を取得して、新しい参照 (ID=0) を作成し、既存の参照をデータベース ルックアップなしで挿入できるようにしたいと考えています。

これは私のコードです。

book.aspx の分離コード - book.aspx.cs:

    ...

    protected void btnSave_Click(object sender, EventArgs e)
    {
        Response.Write(txtReferences.Text); // this contains Titles, but I would like both values.
    }

    public class Reference
    {
        public string Title;
        public int ID;
    }

    [WebMethod]
    public static Array GetReferences(string title)
    {
        // this will be replaced by lookup in database.
        List<Reference> References = new List<Reference>{
            new Reference{ID=1, Title="My ref 1"},
            new Reference{ID=2, Title="Ref ref 2"},
            new Reference{ID=3, Title="Blah ref 3"},
            new Reference{ID=0, Title=title} // for new tags set ID 0 to indicate that this should be created in db
        };

        return References.ToArray();
    }
    ....

これは私の現在のスクリプトです:

<script type="text/javascript">
$(document).ready(function () {
    var failure = function (result) {
        alert(result.status + " " + result.statusText);
    }

        var ref = $("#<%=txtReferences.ClientID %>");
    ref.tagit({
        allowSpaces: true,
        removeConfirmation: true,
        tagSource: function (title, showChoices) {
            var params = '{"title":"' + title.term + '"}';
            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                error: failure,
                url: "book.aspx/GetReferences",
                data: params,
                success: function (data) {
                    var assigned = ref.tagit("assignedTags");
                    var filtered = [];
                    for (var i = 0; i < data.d.length; i++) {
                        if ($.inArray(data.d[i].Title, assigned) == -1) { filtered.push(data.d[i].Title); }
                    }
                    showChoices(filtered);
                }
            });
        }
    });
});
</script>

そしてもちろん、book.aspx ページにテキスト ボックスがあります。

<asp:TextBox ID="txtReferences" runat="server" />

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

2

tag-it docssourcesを見た後、このプラグインは単純な文字列以外をタグとしてサポートしていないので、より多くの情報をやり取りしたい場合は、自分で行う必要があります. 属性が一意であると仮定すると(つまり、同じで異なるsTitleを持つ 2 つのタグは存在しない)、難しいことではありません...TitleID

最初に必要なのは、取得時にどこかにマップTitleすることです。ID

var ids = {}
...
                for (var i = 0; i < data.d.length; i++) {
                    ids[data.d[i].Title] = data.d[i].ID;
                    if ($.inArray(data.d[i].Title, assigned) == -1) { ... }
                }

今、あなたには多くの選択肢があります。私の提案は、タグが追加または削除されるたびに更新される隠しフィールドを使用することです。

function updateHidden() {
    var chosenTags = $.map(ref.tagit("assignedTags"), function(tag) {
        return { Title:tag, ID:(ids[tag] || 0) }; // If the tag is new, use 0 as the ID
    });
    $("#<%=yourHiddenField.ClientID %>").val(JSON.stringify(chosenTags));
}
...
ref.tagit({
   ...
   onTagAdded:updateHidden,
   onTagRemoved:updateHidden
}

(注:JSONを提案しましたが、サーバーが処理するのにより便利な形式であれば何でも使用できます)

protected void btnSave_Click(object sender, EventArgs e)
{
    Response.Write(yourHiddenField.Text); // this contains both values, encoded in JSON format.
}
于 2012-08-23T13:30:34.087 に答える