MVC RedirectToAction不隐藏参数
本文关键字:参数 隐藏 RedirectToAction MVC | 更新日期: 2023-09-27 18:02:57
我有以下动作
public ActionResult TemplateBuilder(int id, int? processId) { }
然后是下面的
@Url.Action("TemplateBuilder","InspectionTemplate")/id/processId
url看起来像:InspectionTemplate/TemplateBuilder/1/2
return RedirectToAction("TemplateBuilder","InspectionTemplate", new { id=1, processId = 2});
然后我得到以下结果:InspectionTemplate/TemplateBuilder/1?processId=2
我该如何解决这个问题。
这是我的路由
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "IDRoute",
url: "{controller}/{action}/{id}",
defaults: new
{
controller = "Login",
action = "Index",
id = UrlParameter.Optional
}
);
routes.MapRoute(
name: "ProcessRoute",
url: "{controller}/{action}/{id}/{processId}",
defaults: new
{
controller = "InspectionTemplate",
action = "TemplateBuilder",
id = UrlParameter.Optional,
processId = UrlParameter.Optional
}
);
routes.MapRoute(
name: "DateRoute",
url: "{controller}/{action}/{year}/{month}/{day}",
defaults: new
{
controller = "Inspection",
action = "Assign",
year = UrlParameter.Optional,
month = UrlParameter.Optional,
day = UrlParameter.Optional
}
);
}
你的路由定义有三个问题
- 只能在路由定义的最后一个参数上标记
UrlParameter.Optional
。如果您只提供一个,那么路由引擎无法知道应该绑定哪个参数因此值(s)将作为查询字符串参数添加)。 - 然而,主要问题是路由的顺序。路由
引擎按照定义声明的顺序搜索定义一旦找到匹配的就会停止,在你的例子中IDRoute
将匹配,因此需要交换路由。 - 然而,这可能会导致其他路由定义的问题,所以最好使您的路线唯一可识别,例如通过 在路由定义中指定控制器名。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "ProcessRoute",
url: "InspectionTemplate/{action}/{id}/{processId}",
defaults: new { controller = "InspectionTemplate", action = "TemplateBuilder", processId = UrlParameter.Optional }
);
routes.MapRoute(
name: "DateRoute",
url: "Inspection/{action}/{year}/{month}/{day}",
defaults: new { controller = "Inspection", action = "Assign", } // assumes all parameters are required
);
// The default will only be match if the url does not start with '/InspectionTemplate/' or '/Inspection/'
routes.MapRoute(
name: "IDRoute",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);
}