4

テーブル「deliverables」、「tags」、および「deliverables_has_tags」を含むmysqlデータベースがあります。成果物にタグをリンクしたい。

これは私が私のjavascriptファイルで行うことです:

<script type="text/javascript" language="javascript">
    $(function () {
        var object = {};
        $.ajax({
            type: "GET",
            url: "/Deliverable/Tags",
            dataType: "json",
            success: function (data) {
                object.tags = data;
            }
        });

        function split(val) {
            return val.split(/,\s*/);
        }
        function extractLast(term) {
            return split(term).pop();
        }
        $("#tags")
        // don't navigate away from the field on tab when selecting an item
            .bind("keydown", function (event) {
                if (event.keyCode === $.ui.keyCode.TAB &&
                $(this).data("ui-autocomplete").menu.active) {
                    event.preventDefault();
                }
            })

.autocomplete({
    minLength: 0,
    source: function (request, response) {
        // delegate back to autocomplete, but extract the last term
        response($.ui.autocomplete.filter(
object.tags, extractLast(request.term)));
    },
    focus: function () {
        // prevent value inserted on focus
        return false;
    },
    select: function (event, ui) {
        var terms = split(this.value);
        // remove the current input
        terms.pop();
        // add the selected item
        terms.push(ui.item.value);
        // add placeholder to get the comma-and-space at the end
        terms.push("");
        this.value = terms.join(", ");

        return false;
    }
});
    });
</script>

テキストボックスに複数のタグを追加できます。

しかし今、これを自分のリポジトリに保存したいと思います。コントローラーの Action メソッドで:

repository.AddDeliverable(model.Title, model.Description, model.UsernameID, data, datatwo, model.VideoUrl, model.AfstudeerrichtingID, model.ProjectID);

タグのアクション:

public JsonResult Tags()
{
    var data = (repository.GetTags()).ToArray();

    return Json(data, JsonRequestBehavior.AllowGet);
}

私のリポジトリで:

public IQueryable<string> GetTags()
{
    return from tag in entities.tags
           orderby tag.tag_name
           select tag.tag_name;
}

これをデータベースに保存する方法がわかりません。
誰でも私を助けることができますか?

4

2 に答える 2

2

私があなたの質問を正しく理解していれば、次のようにタグ処理を実装しています:

  1. データを含まない入力プレースホルダーを持つビューを返す MVC アクション メソッドがあります。
  2. プレースホルダー自体にはおそらくinput type=textid=tags が付いています
  3. 「dom ready」で、配列として json シリアル化されたデータベースからタグを取得する ajax リクエストを起動します。到着したら、tags変数に保存します(エラー処理なし(!))
  4. 同時に、ユーザー入力に反応し、tags 変数から項目を返す jqueryui オートコンプリートで入力を装飾します。
  5. 入力には既にタグ (コンマ区切り) が含まれているため、フィルターは最後のタグの最初の文字です。

したがって、ユーザーがいくつかのコンマ区切りのタグを入力し (おそらくそれらのいくつかは新しいものである可能性があります)、データベースに保存したい場合があります。各入力について、それが既知のタグである場合は、それを「deliverables_has_tags」に保存する必要があります。新しいタグがある場合は、「tags」と「deliverables_has_tags」の両方に保存する必要があります。

最も一般的なシナリオは、保存プロセスを開始するための「保存」ボタンを使用することです。その過程で何をしなければならないかを分析しましょう。

1) ボタンクリック

ボタンをクリックすると、js を使用してコンマ区切りのタグ文字列をsplit(term)配列などのロジックを使用して変換し、シリアル化します。serializeArrayを使用してシリアル化を行い、JSON オブジェクトを手動で作成するか、または を使用してフォーム全体をシリアル化できます $('#yourForm').serialize()。最初のオプションを選択すると、JSON 形式をより詳細に制御でき、MVC の既定のモデル バインダーの問題を回避できます。

2) Ajax 呼び出し

JSON オブジェクトを送信する準備ができたら 、MVC POST アクション メソッドに対してajax POSTリクエストを発行します。状態を保存するときは常に GET を避けてください。新しいバージョンのブラウザーはページをスキャンし、GET 要求を使用して積極的に URL を事前に読み込むことができるからです。あなたはここでこれをしたくありません。もちろん、データを ajax 呼び出しのデータ パラメータとして使用します。

3) アクション方法

リクエストが届いたら、コントローラーで新しいアクション メソッドを使用して処理する必要があります。通常、この場合public JsonResult SaveTags(SaveTagsModel saveTags) { ... }、リポジトリを使用してタグを保存し、「OK」または「エラー」などの結果を返すようなものがあります (response.isSaved=true/false など)。トリッキーな部分は、JSON オブジェクトに従ってビュー モデルを設計することです。これが役立つ場合があります。コレクションに関しては、これは貴重な情報になる可能性があります。

保存するときは、トランザクションを使用して、すべてが一度に保存されるようにします。最初に各タグがデータベースに存在するかどうかを確認し、存在しないタグを挿入します。その後、タグごとに適切な nn 関係があるかどうかを確認し、deliverables_has_tagsない場合は挿入します。両方の操作に同じリポジトリ カプセル化を使用する必要があると思います。

于 2013-06-15T14:16:08.420 に答える
1

post アクションで、 FormCollection コレクションを引数として含め、そこからタグを収集します。自動的な方法はありません。カスタム モデル バインディングを実装することもできますが、それはおそらく努力する価値はありません。

于 2013-06-11T07:59:05.140 に答える