2017-09-18 7 views
0

J'ai un contrôleur + action très simple, et quand je fais un POST je reçois un 404 je ne comprends tout simplement pas.La publication sur le contrôleur donne une erreur 404 - le routage semble être cassé?

Mon 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 }); 

} 

Mon contrôleur:

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); 
    } 

}

Maintenant, je peux facilement ouvrir /task/75 et j'obtenir le résultat de l'index correct et un ID du projet. Mais je ne peux tout simplement pas POST à ​​/task/UpdateSigneeRequest. J'ai également essayé d'enlever le paramètre de cette méthode mais rien ne semble fonctionner.

Je ne comprends tout simplement pas cela car mon chemin Default devrait correspondre à cela (Contrôleur étant une tâche, l'action étant UpdateSigneeRequest, id étant facultatif).

Répondre

3

Vous pouvez fournir une contrainte pour la définition de votre itinéraire afin qu'il soit spécifique pour un nombre valeur après task dans l'URL et votre requête GET sera traitée correctement (ex: /task/100) par cette définition.

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 } 
); 

Vous pouvez faire la même chose (en spécifiant une contrainte pour votre paramètre) dans attribute routing ainsi.

[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); 
}