我正在尝试映射某些路由,以便自动生成的Url看起来像
Admin/controller/action/param
对于这两个代码块,
@Url.Action("action","controller",new{id="param"})
和
@Url.Action("action","controller",new{type="param"})
我所做的是区域注册中的以下内容,
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index",
id = UrlParameter.Optional },
new string[] { "namespaces" });
context.MapRoute(
"Admin_type",
"Admin/{controller}/{action}/{type}",
new { action = "Index",
type = UrlParameter.Optional },
new string[] { "namespaces" });
当参数名称为id
时,生成的网址符合预期,但当参数名称为type
而不是controller/action/typevalue
时,会生成类似controller/action/?type=typevalue
有没有办法生成类似于controller/action/typevalue
的网址,以保持Admin_default
路由的生成器行为完好无损?
答案 0 :(得分:5)
当参数名称为id时,生成的url符合预期,但是何时生成 参数名称是type,而不是controller / action / typevalue,它 生成类似controller / action /?type = typevalue
的内容
这是因为第一条路线用于映射网址(ID是可选的)。
您可以尝试为路线添加一些约束。我猜你的id参数是一个整数,type参数是一个字符串。在这种情况下,您可以尝试使用此路线:
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { id = @"\d+" },
new string[] { "namespaces" });
context.MapRoute(
"Admin_type",
"Admin/{controller}/{action}/{type}",
new { action = "Index", type = UrlParameter.Optional },
new string[] { "namespaces" });
您可以找到有关路线约束的更多信息here。
答案 1 :(得分:2)
您是否尝试删除ID上的可选默认值?在这种情况下,仅提供类型参数时,第一个路径不应匹配。
编辑:再次阅读你的问题之后,我的解决办法并没有保持你的第一条路线完好无损......
答案 2 :(得分:0)
您只需要一条路线。
context.MapRoute("Admin_default",
"Admin/{action}/{id}",
new { action = "Index",
id = UrlParameter.Optional },
new string[] { "namespaces" });
在您的控制器中
网址: http://website/Admin/index/hello
public class AdminController()
{
public ActionResult Index(string id)
{
// do whatever
returne View();
}
public ActionResult type(string id)
{
// do whatever
returne View();
}
}