我有一个名为Entry
的控制器,它有三个ActionResults:View
,New
和Edit
。
View
操作接受表示特定Entry对象的字符串参数。
我正在试图弄清楚如何在网址中不显示“查看”这个词。换句话说,我希望它像默认动作一样。
理想情况下,我希望将网址读取为:
给定条目的
- / entry / 2DxyJR
- / entry / new 创建新条目
- / entry / edit / 2DxyJR 编辑指定条目
我相信这可以通过自定义路线完成,但我不确定如何实际操作。此路线适用于隐藏“查看”,但/new
和/edit
不起作用。
routes.MapRoute(
name: "Entry",
url: "entry/{id}",
defaults: new { controller = "Entry", action = "View", id = UrlParameter.Optional }
);
对于这种极端的无聊感到抱歉,但我仍然试图绕过路由的工作方式。
答案 0 :(得分:2)
您需要确保将更具体的内容放在最上面,因此条目/ ID必须是最后一个,因为它似乎有基于字符串的ID。
这将匹配最明确的(新的)第一个,然后如果在网址中有编辑,那么如果没有落到视图操作。
routes.MapRoute(
name: "Entry",
url: "entry/new",
defaults: new { controller = "Entry", action = "New" }
);
routes.MapRoute(
name: "Entry",
url: "entry/edit/{id}",
defaults: new { controller = "Entry", action = "Edit", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Entry",
url: "entry/{id}",
defaults: new { controller = "Entry", action = "View", id = UrlParameter.Optional }
);
答案 1 :(得分:1)
我认为路径约束实现传递了“entry /”后面的所有字符串,但是除了view,edit和new之类的字样,所以“Default”路由可以处理。类似的东西:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"EntryView",
"Entry/{identifier}",
new { controller = "Entry", action = "View" },
new { identifier = new NotEqual(new string[]{"View", "Edit" , "New"}) }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
这是NotEqual类:
public class NotEqual : IRouteConstraint
{
private string[] _match;
public NotEqual(string[] match)
{
_match = match;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
for (int i = 0; i < _match.Length; i++)
{
if (String.Compare(values[parameterName].ToString(), _match[i], true) == 0)
{
return false;
}
}
return true;
}
}
我测试了它并且它有效,我在http://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx
上找到了它