1

、、およびのEntry3 つの ActionResultsを持つというコントローラーがあります。ViewNewEdit

このViewアクションは、特定の Entry オブジェクトを表す文字列パラメーターを受け入れます。

URLに「表示」という単語を表示しない方法を見つけようとしています。つまり、デフォルトのアクションのように動作するようにしたいのです。

理想的には、URL を次のように読みたいと思います。

  • 特定のエントリの /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 }
);

これの極端な初心者で申し訳ありませんが、私はまだルーティングがどのように機能するかについて頭を悩ませようとしています.

4

2 に答える 2

2

より具体的なものを一番上に置く必要があります。文字列ベースのIDを持っているように見えるため、エントリ/IDは最後にする必要があります。

これは、最初に最も明示的な(新しい)ものと一致し、次にURLに編集がある場合は一致し、そうでない場合は表示アクションにフォールスルーします。

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 }
);
于 2012-09-07T20:24:41.597 に答える
1

「entry/」の背後にあるすべての文字列を渡すルート制約の実装だと思いますが、view、edit、new などの単語を除いて、「デフォルト」ルートで処理できます。何かのようなもの:

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

于 2012-09-07T21:58:18.257 に答える