在过去的几个小时中,我一直在尝试更改网站的路由,但我根本无法确定ASP.net向我要什么!
这是我的默认路由:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{Id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, }
);
每当我访问以下URL时,它都会成功显示Home / Index:
/
/Home
/Home/Index
但是,我有一个名为“ K”的操作,如下所示,该操作收到一个参数“ name”:
public ActionResult K(string name)
我想定义一条路由,使用该模板将我重定向到/Home/K/{name}
website.com/K/{name}
我在下面尝试了这条路线,但这行不通:
routes.MapRoute(
"OnlyK",
"K/{id}",
new { controller = "Home", action = "K", id = UrlParameter.Optional }
);
即使没有此路由配置,如果我转到website.com/Home/K/something
,它也不会将“某物”识别为id(控制器参数== null)!
我在做什么错了?
答案 0 :(得分:2)
在website.com/Home/K/something
操作方法null
中,URL name
导致参数K
的{{1}}值,因为参数名称不匹配。 br />
此方法是通过路由ActionResult K(string name)
进行服务的,其中
声明一个名称为Default
的参数(通过id
),而操作方法{controller}/{action}/{id}
的参数为K
。
您可以通过name
否决操作方法上的参数名称来解决此问题,以使两者都匹配。
BindAttribute
要执行从ActionResult K([Bind(Prefix ="id")] string name)
到website.com/K/{name}
的重定向,您可以设置一个自定义website.com/Home/K/{name}
来处理此重定向。
注册一个处理任何与路由IRouteHandler
匹配的请求的路由,然后将其重定向到具有知名名称的路由(此处为K/{id}
)。
由于讨论的参数名称不匹配,我们将在路由中使用K
而不是{id}
。
{name}
如下定义此路线routes.Add(new Route("K/{id}", new RedirectRouteHandler("K")));
。
K
routes.MapRoute(
name: "K",
url: "Home/K/{id}",
defaults: new { controller = "Home", action = "K", id = UrlParameter.Optional }
);
和RouteHandler
进行重定向。
RedirectHandler
类具有HttpResponse
方法,该方法可以处理路由名称和路由值,而无需自己构造网址。
RedirectToRoute
请注意,已注册路线的顺序很重要; class RedirectRouteHandler : IRouteHandler
{
private readonly string _routeName;
public RedirectRouteHandler(string routeName)
{
_routeName = routeName;
}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new RedirectHandler(this._routeName, requestContext.RouteData.Values);
}
}
class RedirectHandler : IHttpHandler
{
private readonly string _routeName;
private readonly RouteValueDictionary _routeValues;
public RedirectHandler(string routeName, RouteValueDictionary routeValues)
{
this._routeName = routeName;
this._routeValues = routeValues;
}
public bool IsReusable { return false; }
public void ProcessRequest(HttpContext context)
{
context.Response.RedirectToRoute(this._routeName, this._routeValues);
}
}
看起来像。
RegisterRoutes