いくつかのデータを含むグリッドがあります。この写真のように見えます。
削除する行をいくつか選択して削除ボタンをクリックすると、削除ボタンでサーバー側アクションへの ajax 呼び出しが行われます。サーバー側のアクションは、選択したカテゴリをデータベースから削除し、保持しているメモリ内キャッシュからも削除します。
次に、カテゴリ グリッドを含む部分ビューを返すアクションにリダイレクトし、更新されたモデルを提供します。
ただし、サーバー側のアクションが正常に完了した後にグリッドを表示すると、古い表示が維持されます。つまり、削除したばかりの行が選択された行としてグリッドに表示されます。
関連するコードは次のとおりです。
サーバ側:
[HttpPost]
public ActionResult Delete(long[] categoryIds)
{
if (categoryIds != null && categoryIds.Length > 0)
{
foreach (var categoryId in categoryIds)
{
Category.Delete(categoryId);
DeleteFromCachedCategories(categoryId);
}
}
return PartialView("_CategoriesPartial", GetCategoryList());
}
private IEnumerable<Category> GetCategoryList()
{
lock (padLock)
{
if (CacheManager.Contains(CacheKeys.AllCategories))
{
return CacheManager.Get<IEnumerable<Category>>(CacheKeys.AllCategories);
}
}
var list = Category.All as List<Category>;
if (!list.Contains(Category.Empty)) list.Insert(0, Category.Empty);
lock (padLock)
{
CacheManager.Add(CacheKeys.AllCategories, list);
}
return list;
}
private void UpdateCachedCategories(Category category)
{
var categories = CacheManager.Get<List<Category>>(CacheKeys.AllCategories);
if (categories != null)
{
if (categories.AsEnumerable().Contains(category, Category.CategoryIdComparer))
{
var cachedCategory = categories.SingleOrDefault(c => c.Id == category.Id);
cachedCategory.Name = category.Name ?? string.Empty;
}
else
{
categories.Add(category);
}
}
}
private void DeleteFromCachedCategories(long categoryId)
{
var categories = CacheManager.Get<List<Category>>(CacheKeys.AllCategories);
if (categories != null)
{
var index = categories.FindIndex(c => c.Id == categoryId);
if (index >= 0)
categories.RemoveAt(index);
}
}
ビュー (カミソリ): [_CategoriesPartial.cshtml]
@using System.Web.UI.WebControls;
@using System.Data;
@model IEnumerable<GlobalizationUI.BusinessObjects.Category>
@Html.DevExpress().GridView(settings =>
{
settings.Name = "gvCategories";
settings.CallbackRouteValues = new { Controller = "Category", Action = "CategoriesPartial" };
settings.Width = 1200;
settings.SettingsPager.Position = PagerPosition.TopAndBottom;
settings.SettingsPager.FirstPageButton.Visible = true;
settings.SettingsPager.LastPageButton.Visible = true;
settings.SettingsPager.PageSizeItemSettings.Visible = true;
settings.SettingsPager.PageSizeItemSettings.Items = new string[] { "10", "20", "50", "100", "200" };
settings.SettingsPager.PageSize = 50;
settings.Settings.ShowFilterRow = true;
settings.Settings.ShowFilterRowMenu = true;
settings.CommandColumn.Visible = true;
settings.CommandColumn.ClearFilterButton.Visible = true;
settings.CommandColumn.ShowSelectCheckbox = true;
settings.Settings.ShowHeaderFilterButton = true;
settings.KeyFieldName = "Id";
settings.Columns.Add("Name");
settings.SettingsEditing.AddNewRowRouteValues = new { Controller = "Category", Action = "CreateNew" };
settings.SettingsEditing.UpdateRowRouteValues = new { Controller = "Category", Action = "Edit" };
settings.SettingsEditing.Mode = GridViewEditingMode.Inline;
settings.CommandColumn.Visible = true;
settings.CommandColumn.NewButton.Visible = true;
settings.CommandColumn.EditButton.Visible = true;
settings.CommandColumn.UpdateButton.Visible = true;
}).Bind(Model).GetHtml()
コンテナー ビューからの関連スニペット: [Index.cshtml]
@model IEnumerable<GlobalizationUI.BusinessObjects.Category>
@Html.Partial("_CategoriesPartial", Model)
<script type = "text/javascript">
//<![CDATA[
$(document).ready(
function () {
WireHandlers();
}
);
function DeleteCategories(selectedCategoriesArray) {
if (selectedCategoriesArray.length == 0) return;
debugger;
var url = '/Category/Delete';
$.ajax(url,
{
cache: false, async: false, type: 'POST',
data: JSON.stringify({ categoryIds: selectedCategoriesArray }), dataType: 'json',
contentType: 'application/json', traditional: true,
error: OnError, success: OnSuccess
});
function OnSuccess(data, textStatus, jqXHR) {
debugger;
}
function OnError(jqXHR, textStatus, errorThrown) {
}
}
function DeleteSelectedCategories() {
if (gvCategories.GetSelectedRowCount() == 0) return;
gvCategories.GetSelectedFieldValues('Id', DeleteCategories);
}
function WireHandlers() {
$('#btnDeleteCategory').unbind("click").click(DeleteSelectedCategories);
}
// ]]>
</script>
Windows 7 Home Premium 64 ビット マシンで ASP.NET MVC 4 用の DevExpress Extensions v12.2.10.0 を使用しています。