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 = '"' + @Html.ActionLink("Remove", "RemoveItemFromList", "Deployment", null, new { @class = "viewSeasonsLink" }) + '"'; */
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>
これは機能しますが、少し厄介です。削除リンクがクリックされる前にフォームに加えられた変更はすべて失われることを意味します。