1

部分/ダイアログで削除ビューを表示します。最初はアイテムが選択されていません。ユーザーが[OK]ボタンをクリックすると、[投稿の削除]アクションとそのパラメーターselectedIdsがNULLになります。大丈夫ですが、どうすればユーザーにエラーメッセージを表示できますか?

コード「returnPartialView」に到達すると、ビューで例外が発生し、Model.DisplayListが空ではありません。

ここで2つの問題が混在しているように見えますが、一方が他方を解決できると思います...

アクションの削除:

[HttpGet]
        public ActionResult Delete()
        {
            var templates = _templateDataProvider.GetTemplates();
            var listViewModel = new ListViewModel<Template>();
            listViewModel.DisplayList = templates;
            return PartialView(listViewModel);
        }

        [HttpPost]
        public ActionResult Delete(int[] selectedIds)
        {
            if (selectedIds == null)
            {
                ModelState.AddModelError("Name", "Nothing selected");
            }

            if (ModelState.IsValid)
            {
                return Json(new { success = true });
            }

            return PartialView();
        }

ビューの削除:

@model ITMS.ViewModels.ListViewModel<ITMS.Models.Template>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm("Delete", "Template"))
{ 
    @Html.ValidationSummary(false)      
    @Html.ListBoxFor(x => x.SelectedIds, new SelectList(Model.DisplayList, "Id", "Name"),new { @class = "select"} )
}

私がこれを返すとき:

return PartialView(new ListViewModel<Template> { DisplayList = _templateDataProvider.GetTemplates() });

その後は機能しますが、このためにデータベースに再度アクセスする必要はありません。

4

1 に答える 1

1

例外があり、部分ビューを再表示する場合のPOSTの削除アクションでは、このビューにモデルを渡していません。それでも、リストボックスをロードするには、ビューにDisplayListプロパティが必要です。したがって、GETアクションで行ったのと同じ方法でモデルを渡していることを確認してください。

var templates = _templateDataProvider.GetTemplates();
var listViewModel = new ListViewModel<Template>();
listViewModel.DisplayList = templates;
return PartialView(listViewModel);

もう1つの可能性は、削除アクションでビューモデルを直接取得することです。

[HttpPost]
public ActionResult Delete(ListViewModel<Template> model)
{
    if (ModelState.IsValid)
    {
        return Json(new { success = true });
    }

    // Make sure you rebind the DisplayList property
    model.DisplayList = _templateDataProvider.GetTemplates();
    return PartialView(model);
}

これで、検証に関する限りSelectedIds、たとえばRequired属性を使用してビューモデルのプロパティを装飾できます。

[Required]
public IEnumerable<Template> SelectedIds { get; set; }

アップデート:

POSTアクションでリストを再度ロードするためのデータベースへのアクセスに関するコメントセクションで、パフォーマンスの懸念が表明されています。このパフォーマンスへの影響を回避するために、値をキャッシュして再利用できます。

このような:

public IEnumerable<Template> GetTemplates()
{
    var templates = HttpContext.Cache["templates"] as IEnumerable<Template>;
    if (templates == null)
    {
        templates = _templateDataProvider.GetTemplates();
        HttpContext.Cache["templates"] = templates;
    }
    return templates;
}

その後:

public ActionResult Delete()
{
    var listViewModel = new ListViewModel<Template>();
    listViewModel.DisplayList = GetTemplates();
    return PartialView(listViewModel);
}

[HttpPost]
public ActionResult Delete(ListViewModel<Template> model)
{
    if (ModelState.IsValid)
    {
        return Json(new { success = true });
    }

    model.DisplayList = GetTemplates();
    return PartialView(model);
}
于 2012-05-23T17:32:45.020 に答える