2017-09-18 5 views
0

私は非常にシンプルなコントローラー+アクションを持っています。私がPOSTをすると、私は404が得られます。コントローラに投稿すると404エラーが発生する - ルーティングが壊れているようですか?

マイRouteConfig:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 


    routes.MapRoute(
       name: "Task view", 
       url: "task/{projectid}", 
       defaults: new { controller = "Task", action = "Index" }); 

    routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

} 

マイコントローラ:

public class TaskController : Controller 
{ 


    // GET: Task 
    [System.Web.Mvc.HttpGet] 
    public async Task<ActionResult> Index(int projectid) 
    { 
     // extremely nice and insightful code 
     return View(vm); 
    } 

    [System.Web.Mvc.HttpPost] 
    public async Task<JsonResult> UpdateSigneeRequest([FromBody] TaskViewModel task) 
    { 
     // even more smart code 
     return Json("OK", JsonRequestBehavior.AllowGet); 
    } 

}

、私は/task/75簡単に開くことができると私は正しいインデックスの結果を取得していプロジェクトID。しかし、私は単に/task/UpdateSigneeRequestにPOSTすることはできません。私もこのメソッドからパラメータを削除しようとしましたが、何も動作していないようです。

Defaultルートがこれと一致する必要があります(コントローラのタスク、アクションはUpdateSigneeRequest、IDはオプション)。

それはURLで task値に対して特異的であり、あなたのGETリクエストが適切に処理されるように、あなたはあなたのルート定義のための制約を提供することができます

答えて

3

:その定義によって(例:/task/100)。

routes.MapRoute(
    "Task view", 
    url: "task/{projectid}", 
    defaults: new { controller = "Task", action = "Index" }, 
    constraints: new { projectid = @"\d+" } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

あなたにもattribute routingで同じこと(あなたのパラメータの制約を指定する)を行うことができます。

[System.Web.Mvc.Route("Task/{projectid:int}")] 
public async Task<ActionResult> Index(int projectid) 
{ 
    return View(new SomeViewModel { ProjectId = projectid}); 
} 
[System.Web.Mvc.HttpPost] 
public async Task<JsonResult> UpdateSigneeRequest(IndexVm task) 
{ 
    return Json("OK", JsonRequestBehavior.AllowGet); 
} 
関連する問題