0

MVCでこれを行う方法を理解するのに苦労していますが、

データベースからのコンマ区切りリストを持つエンティティフレームワークオブジェクトがあります(データベース内の恐ろしいcslであるという事実を変更することはできません)。リストを簡単に表示して、手動で編集できるようにします。これはかなりエラーが発生しやすいため、それらを分割してビューにリストを表示したいと考えています。次に、ユーザーがリンク/ボタンをクリックできるようにして、それらを文字列とデータベースから削除し、ページを更新してこれを反映させます。

私が最初に考えたのは、JQuery を使用して ajax json 投稿を行い、@Html.ActionLink をクリックする各項目の削除を行うことでした。非同期ポストバックを実行するように取得でき、アイテムが削除され、UL を更新できる新しい文字列リストを表す文字列が返されます。彼らがリンクを 2 回クリックすると、404 が表示されます。私が使用したスクリプトは次のとおりです。

<script type="text/javascript">

    $(document).ready(function () {
    $('.viewSeasonsLink').click(function () {
            var data =
            {
                item: $(this).parents('li').first().find('.flagName').text(), 
                deploymentId: @Model.Id                 
            };
            $.post(this.href, data, function (result) {
                var list = $("#testme");
                list.empty();
                var items = result.split(",");
                $(items).each(function(index) {

//                  /* var link = '&quot;' +  @Html.ActionLink("Remove",     "RemoveItemFromList", "Deployment", null, new { @class = "viewSeasonsLink" }) + '&quot;';     */
                    var link = '<a class="viewSeasonsLink"     href="/SAMSite/Deployment/RemoveItemFromList">Remove</a>';

                list.append('<li><span class="flagName">' + items[index] + '</span> - ' + link + ' </li>');
                    /* list.append('<li><span class="flagName">' + items[index] + '</span> - ' + '\'' + @Html.ActionLink("Remove", "RemoveItemFromList", "Deployment", null,     new { @class = "viewSeasonsLink" }) + '\'</li>');                     */
                });                
            }, "json");
           return false;     
        });
    });
</script>

アクション リンクを jquery スクリプトで動作させることができなかったので、ハード コーディングを試みましたが、まだ成功しませんでした。

次に、単純なアクションリンクをメソッドに戻して削除し、通常のビューに戻すだけでよいと考えました。これも投稿してデータベースを更新しますが、Webページはまったく更新しません。

 <ul id="testme2">
            @foreach (string flag in ViewBag.FeatureFlags)
            {
                <li><span class="flagName">@flag</span> - @Html.ActionLink("Remove", "RemoveItemFromListTest", "Deployment", null, new { @class = "viewSeasonsLink" })</li>
            }
        </ul>

 public ActionResult RemoveItemFromListTest(string item, int deploymentId)
    {
        Deployment deployment = db.Deployments.Single(d => d.Id == deploymentId);
        ViewBag.CustomerId = new SelectList(db.Customers, "Id", "Name", deployment.CustomerId);

        List<string> featureFlags = deployment.FeatureFlags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
        featureFlags.Remove(item);

        deployment.FeatureFlags = ConvertBackToCommaList(featureFlags);
        ViewBag.FeatureFlags = featureFlags;
        //db.SaveChanges();

        return View("Edit", deployment);
    }

編集

リリースされた私は、ある時点で少しばかげていました:

完全なポストバックを実行して更新を実行するための 2 番目のテストは、まだ jquery によってキャッチされていました (値も渡されていませんでした)。この行を次のように変更しました。

<li><span class="flagName">@flag</span> - @Html.ActionLink("Remove", "RemoveItemFromListTest", "Deployment", new { item = @flag, deploymentId = Model.Id }, null)</li>

これは機能しますが、少し厄介です。削除リンクがクリックされる前にフォームに加えられた変更はすべて失われることを意味します。

4

2 に答える 2

0

ultimately I had one main problem with the jquery solution. When I added a new LI element it was not being hooked up to the ajax call as this was just happening at document.ready. I now replaced the simple .click with a delegate that will also hook up all elements that are added after the ready event, credit to this page for help with it:

$('#featureflaglist').delegate('.removeflaglink', 'click', RemoveFlagFromList); 
于 2012-04-12T08:02:55.447 に答える
0

2 つの問題があると思います。1 つは.Post、viewSeasonsList クリック イベントのイニシャルです。削除を処理するアクションではなく、ページをロードしたアクションに投稿しています。あなたが説明したアプローチに基づいて、それらが同じアクションベースになるとは思えません。

var url = '/SAMSite/Deployment/RemoveItemFromList';

それから

$.post(url, data, function (result) {

次に、Ajax 応答では、リストを再構築するときにhref、リンクの属性を含めています。なんで?これらのリンクを使用してナビゲートしているのではなく、すでにセットアップされている Ajax リクエストを開始しています。

var link = '<a class="viewSeasonsLink">Remove</a>';
于 2012-04-11T14:07:32.393 に答える