0

[HttpPost] を使用して以下の Delete メソッドを定義すると、View から Delete メソッドを呼び出すことができません。ただし、[HttpPost]行を削除すると正常に動作します。私は多くのことを試しましたが、実際にはビューでの@Html.Hiddenまたは@using (Html.BeginForm()の間違った使用法に関連している可能性があります。以下の点について教えてください。

1) WebGrid の削除ボタンをクリックした後、ビューを開きません。確認メソッドの後、Controller の Delete メソッドを呼び出し、同じページに留まってレコードを削除する必要があります。以下の Delete メソッドに [HttpPost] を使用しないのは間違っていますか?

2) 可能であれば、[HttpPost] を Delete メソッドに使用するにはどうすればよいですか? フォームまたは非表示のプロパティを使用して、ビューでどの変更を行う必要がありますか?



意見:

@model IEnumerable<MyProject.Domain.Entities.Applicant>
@using PRMeetingReg.WebUI.HtmlHelpers

@{
    var grid = new System.Web.Helpers.WebGrid(
        source: Model,
        columnNames: new List<string>() { "Title" },
        ajaxUpdateContainerId: "myGrid",
        defaultSort: "Name",
        canPage: true,
        canSort: true,
        rowsPerPage: 5
        );
    grid.SortDirection = SortDirection.Ascending;
}

<div class="Grid">
    @grid.GetHtml(
          tableStyle: "table", 
          headerStyle: "webgrid-header",
          footerStyle: "webgrid-footer", 
          rowStyle: "webgrid-row-style",
          alternatingRowStyle: "webgrid-alternating-row",
          selectedRowStyle: "webgrid-selected-row",
   firstText: "<<",
   lastText: ">>",
   mode: WebGridPagerModes.All,
   fillEmptyRows: true,
   numericLinksCount: 5,

   columns: grid.Columns(
    grid.Column("ApplicantID", "No", canSort: true),
    grid.Column("Name", "Name", canSort: true),
    grid.Column("Surname", "Surname", canSort: true),

    //for using multiple Html.ActionLink in a column using Webgrid
    grid.Column("Actions", format: (item) =>
     new HtmlString(
          @Html.ActionImage("../../Content/icons/detail.png", "Detail", "icon-link", "Detail", "Admin", new { applicantId= item.ApplicantID }).ToString() +
          @Html.ActionImage("../../Content/icons/edit.png", "Edit", "icon-link", "Edit", "Admin", new { applicantId= item.ApplicantID }).ToString() +
          @Html.ActionImage("../../Content/icons/delete.png", "Delete", "icon-link", "Delete", "Admin", new { applicantId= item.ApplicantID }).ToString()
     )
    )
    )
    )


<p>
    <input id="add" type="submit" value="Yeni Ekle" class="button" />   
</p>

</div>



コントローラ:

[HttpPost]
public ActionResult Delete(int applicantId)
{
    Applicant deletedApplicant = repository.DeleteApplicant(applicantId);
    if (deletedApplicant != null)
    {
        TempData["message"] = string.Format("{0} was deleted",
        deletedApplicant.Name);
    }
    return RedirectToAction("Index");
}



私の HTML ヘルパー:

public static MvcHtmlString ActionImage(this HtmlHelper html, string imagePath, string alt, string cssClass,
       string action, string controllerName, object routeValues)
{
    var currentUrl = new UrlHelper(html.ViewContext.RequestContext);
    var imgTagBuilder = new TagBuilder("img"); 
    imgTagBuilder.MergeAttribute("src", currentUrl.Content(imagePath));
    imgTagBuilder.MergeAttribute("title", alt);
    imgTagBuilder.MergeAttribute("class", cssClass);
    string imgHtml = imgTagBuilder.ToString(TagRenderMode.SelfClosing);
    var anchorTagBuilder = new TagBuilder("a"); 
    anchorTagBuilder.MergeAttribute("href", currentUrl.Action(action, controllerName, routeValues));
    anchorTagBuilder.InnerHtml = imgHtml; 
    string anchorHtml = anchorTagBuilder.ToString(TagRenderMode.Normal);
    return MvcHtmlString.Create(anchorHtml);
}

前もって感謝します。

4

1 に答える 1

1

カスタムActionImageヘルパーは、( ) 内にアンカー タグを含む画像を生成し<a>ます。HTML では、アンカーは GET リクエストを送信します。コントローラーのアクションは、呼び出されない理由を説明する HttpPost リクエストで装飾されています。

これを機能させる 1 つの可能性は、AJAX 要求を使用して、[削除] リンクをクリックするときに GET の代わりに POST 要求を実行することです。

于 2013-11-06T10:09:47.393 に答える