MVC4中的默认操作

时间:2012-09-07 20:16:00

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我有一个名为Entry的控制器,它有三个ActionResults:ViewNewEdit

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 }
);

对于这种极端的无聊感到抱歉,但我仍然试图绕过路由的工作方式。

2 个答案:

答案 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

上找到了它