发布到控制器会出现404错误 - 路由似乎被打破了?

时间:2017-09-18 17:27:09

标签: c# asp.net asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing

我有一个非常简单的控制器+动作,当我做一个POST我得到一个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。但我根本无法POST到/task/UpdateSigneeRequest。我也尝试从这个方法中删除参数,但似乎没有任何效果。

我根本不理解这一点,因为我的Default路由应该与此匹配(Controller是任务,操作是UpdateSigneeRequest,id是可选的)。

1 个答案:

答案 0 :(得分:3)

您可以为路线定义提供约束,使其特定于网址中task之后的数字值,并且您的GET请求将得到妥善处理(例如:{{ 1}})按照这个定义。

/task/100

您也可以在attribute routing中执行相同的操作(为参数指定约束)。

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