簡體   English   中英

為 HttpPost 操作獲取 404

[英]Getting 404 for HttpPost Action

我有一個記錄表顯示在部分視圖中,其中一些沒有 ID 值。 因此,在單擊特定記錄的編輯鏈接時,我嘗試使用替代字段作為 ID。 我不確定我是否可以合法地擁有兩個 Post 操作方法,即使我使用不同的方法名稱和參數。

目前,如果我單擊帶有 ID 的記錄,則會調用正確的操作方法。 如果我 select 沒有 ID 的記錄(而不是使用唯一的“帳戶”字符串 ID),我會得到 404。

路由配置:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapMvcAttributeRoutes();
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
}

部分視圖:

...
<td>
    @if (item.ID != null)
    {
        @Html.ActionLink("Edit", "EditBudget", new { id = item.ID })
    }
    else if (item.Account != null)
    {
        @Html.ActionLink("Edit", "EditAccountBudget", new { account = item.Account })
    }
</td>

預算控制器:

// POST: Budgets/Edit/5
[Route("edit/{id?}")]
[HttpPost]
public ActionResult EditBudget(int? id = null, FormCollection collection = null)
{
    ...
    // Responding correctly for URL: http://localhost:4007/edit/19
}

[Route("editaccountbudget/{account}")]
[HttpPost]
public ActionResult EditAccountBudget(string account)
{
    ...
    // Getting 404 for URL: http://localhost:4007/editaccountbudget/6000..130
}

假設 EditBudget 是您的 controller 名稱,您可以將路線更改為此以避免混淆(或保留原樣,因為屬性路線將被忽略)並從您的操作中刪除 [POST] :

[Route("~EditBudget/EditAccountBudget/{account}")]

也改變:

        @Html.ActionLink("Edit", "EditAccountBudget", new new { account = item.Account })

至:

        @Html.ActionLink("EditAccountBudget", "EditBudget", new { account = item.Account })
   

如果您使用 razor 頁面模板控件,您需要根據您的路線映射同時擁有 controller 和路線的動作部分。 如果您使用 ajax 或 httpclient,您可以使用任何路由語法。

ActionLink呈現一個常規的錨 (<a />) 標簽,所以它只做GET而不是POST 如果要發布值,則需要使用實際表單(構建您自己的標簽,或使用Html.BeginForm Html.BeginForm() ),然后在該表單的 scope 中包含一個提交按鈕。

當您在 ActionLink 中使用方法名稱時,您的 BudgetsController 應該如下所示,沒有 HttpPost 屬性Route 屬性 如果您願意,可以使用 HttpGet 屬性。

EditBudget 方法中也不需要FormCollection 集合參數。 你不會得到任何東西,因為它的 Get not Post。

public ActionResult EditBudget(int? id = null)
{
}

public ActionResult EditAccountBudget(string account)
{
}

正如一些人所指出的,這是一個 GET 請求。 如果 ID 是 null,我必須通過 model,因為我需要的不僅僅是帳戶 ID 來構建數據庫查詢。

部分視圖:

@if (item.ID != null)
{
    @Html.ActionLink("Edit", "EditBudget", new { id = item.ID })
}
else if (item.Account != null)
{
    @Html.ActionLink("Edit", "EditBudget", new { account = item.Account,
        SelectedDepartment = item.SelectedDepartment, SelectedYear = item.SelectedYear })
}

預算控制器:

// GET
public ActionResult EditBudget(int? id, BudgetsViewModel model)
{
    repo = new BudgetDemoRepository();
    if (id != null)
    {
        // Pass id to repository class
    }
    else
    {
        // Pass account and other params to repository class

    }

    return View(...);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM