[英]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.