0

この部分ビューの削除は、jqueryダイアログに表示されます。

削除ビューがデバッグモードでロードされると、モデルのカウントが3であることがわかりますが、[削除]ボタンを押すと、NullReferenceExceptionが発生し、そのモデルはNullになります。

どうしてそれができるのでしょうか?

@using (@Html.BeginForm("Delete","Template",FormMethod.Post))
{  
    <table>
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Id)
            </td>  
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>      
            <td>           
                @Html.ActionLink("Delete", "Delete", new { id = item.Id, returnUrl = Request.Url.PathAndQuery })
            </td>
        </tr>
    }
    </table>
}

コントローラ:

  [HttpGet]
        public ActionResult Delete()
        {
            string actionName = ControllerContext.RouteData.GetRequiredString("action");
            if (Request.QueryString["content"] != null)
            {
                ViewBag.FormAction = "Json" + actionName;

                var list = new List<Template> {
                    new Template{ Id = 1, Name = "WorkbookTest"},
                    new Template{ Id = 2, Name = "ClientNavigation"},
                    new Template{ Id = 3, Name = "Abc Rolap"},
                    };

                return PartialView(list);
            }
            else
            {
                ViewBag.FormAction = actionName;
                return View();
            }
        }

 [HttpPost]
        public JsonResult JsonDelete(int templateId, string returnUrl)
        {
            // do I get here no !
            if (ModelState.IsValid)
            {
                return Json(new { success = true, redirect = returnUrl });
            }

            // If we got this far, something failed
            return Json(new { errors = GetErrorsFromModelState() });
        }

アップデート:

そのコードは機能し、正しいtemplateIdをコントローラーに提供しています。

<table>
@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Id)
        </td>  
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>      
        <td> 
            @using (@Html.BeginForm((string)ViewBag.FormAction, "Template"))
            {
                @Html.Hidden("returnUrl", Request.Url.PathAndQuery);
                @Html.Hidden("templateId", item.Id)               
                <input type='submit' value='Delete' />
            }
        </td>
    </tr>
}
</table>
4

1 に答える 1

0

ActionLinkの記述方法から判断すると、 [削除]をクリックすると、コントローラーのelse部分が実行されます(コンテンツがクエリ文字列に含まれないため)。そのコードはモデルなしでView()を返すため、「モデルはnull」例外です。

編集

私が見ることができる2つの問題があります:

  1. 対象とするアクションにはPOSTが必要であるため、ActionLink(GETを使用)ではなく、フォームのポストバックを使用する必要があります。
  2. アクションはtemplateIdを期待しているため、route属性はそれである必要があります。

だから私はこれがうまくいくはずだと思っています:

@{ using (Html.BeginForm()) {
    <input type='hidden' name='templateId' value='@item.Id' />
    <input type='submit' value='Delete' />
}}
于 2012-05-06T02:23:22.980 に答える