我有一个非常简单的控制器+动作,当我做一个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是可选的)。
答案 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 }
);