1. ホーム
  2. asp.net-mvc

ASP.NET MVC メソッド属性によるルーティング [終了しました]。

2023-08-12 10:24:12

質問

StackOverflow ポッドキャスト #54 で、Jeffは、ルートを処理するメソッドの上の属性を通じて、StackOverflowコードベースにURLルートを登録することに言及しています。良いコンセプトのように聞こえます (ルートの優先順位に関して Phil Haack 氏が提起した注意事項があります)。

誰か、これを実現するためのサンプルを提供してくれませんか?

また、このスタイルのルーティングを使用するためのベストプラクティスがあれば教えてください。

どのように解決するのですか?

アップデイト : に掲載されました。 コードプレックス . 完全なソースコードと、コンパイル済みのアセンブリがダウンロードできます。 まだドキュメントをサイトに掲載する時間がないので、今のところこのSOの記事で十分です。

アップデイト : 1) ルート順序、2) ルートパラメータの制約、3) ルートパラメータのデフォルト値を扱うために、いくつかの新しい属性を追加しました。 以下のテキストはこの更新を反映したものです。

私は実際にこのようなことを私のMVCプロジェクトで行ってきました(Jeffがstackoverflowでどのように行っているのかはわかりません)。 私はカスタム属性のセットを定義しました。UrlRoute、UrlRouteParameterConstraint、UrlRouteParameterDefaultです。 これらは、MVCコントローラのアクション・メソッドに添付して、ルート、制約、およびデフォルトが自動的にバインドされるようにすることができます。

使用例です。

(この例は多少作為的ですが、この機能を示すものであることに注意してください)

public class UsersController : Controller
{
    // Simple path.
    // Note you can have multiple UrlRoute attributes affixed to same method.
    [UrlRoute(Path = "users")]
    public ActionResult Index()
    {
        return View();
    }

    // Path with parameter plus constraint on parameter.
    // You can have multiple constraints.
    [UrlRoute(Path = "users/{userId}")]
    [UrlRouteParameterConstraint(Name = "userId", Regex = @"\d+")]
    public ActionResult UserProfile(int userId)
    {
        // ...code omitted

        return View();
    }

    // Path with Order specified, to ensure it is added before the previous
    // route.  Without this, the "users/admin" URL may match the previous
    // route before this route is even evaluated.
    [UrlRoute(Path = "users/admin", Order = -10)]
    public ActionResult AdminProfile()
    {
        // ...code omitted

        return View();
    }

    // Path with multiple parameters and default value for the last
    // parameter if its not specified.
    [UrlRoute(Path = "users/{userId}/posts/{dateRange}")]
    [UrlRouteParameterConstraint(Name = "userId", Regex = @"\d+")]
    [UrlRouteParameterDefault(Name = "dateRange", Value = "all")]
    public ActionResult UserPostsByTag(int userId, string dateRange)
    {
        // ...code omitted

        return View();
    }

UrlRouteAttributeの定義です。

/// <summary>
/// Assigns a URL route to an MVC Controller class method.
/// </summary>
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UrlRouteAttribute : Attribute
{
    /// <summary>
    /// Optional name of the route.  If not specified, the route name will
    /// be set to [controller name].[action name].
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Path of the URL route.  This is relative to the root of the web site.
    /// Do not append a "/" prefix.  Specify empty string for the root page.
    /// </summary>
    public string Path { get; set; }

    /// <summary>
    /// Optional order in which to add the route (default is 0).  Routes
    /// with lower order values will be added before those with higher.
    /// Routes that have the same order value will be added in undefined
    /// order with respect to each other.
    /// </summary>
    public int Order { get; set; }
}

UrlRouteParameterConstraintAttributeの定義です。

/// <summary>
/// Assigns a constraint to a route parameter in a UrlRouteAttribute.
/// </summary>
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UrlRouteParameterConstraintAttribute : Attribute
{
    /// <summary>
    /// Name of the route parameter on which to apply the constraint.
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Regular expression constraint to test on the route parameter value
    /// in the URL.
    /// </summary>
    public string Regex { get; set; }
}

UrlRouteParameterDefaultAttributeの定義です。

/// <summary>
/// Assigns a default value to a route parameter in a UrlRouteAttribute
/// if not specified in the URL.
/// </summary>
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UrlRouteParameterDefaultAttribute : Attribute
{
    /// <summary>
    /// Name of the route parameter for which to supply the default value.
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Default value to set on the route parameter if not specified in the URL.
    /// </summary>
    public object Value { get; set; }
}

Global.asax.csの変更。

MapRouteへの呼び出しを、RouteUtility.RegisterUrlRoutesFromAttributes関数への単一の呼び出しに置き換えます。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        RouteUtility.RegisterUrlRoutesFromAttributes(routes);
    }

RouteUtility.RegisterUrlRoutesFromAttributesの定義です。

完全なソースは以下のサイトにあります。 コードプレックス . フィードバックやバグレポートがあれば、このサイトへお願いします。