13

私は密でなければなりません。StackOverflow についていくつか質問した後も、ASP.NET MVC で提供される新しいルーティング エンジンを理解するのにまだ迷っています。問題を非常に単純なものに絞り込んだと思います。これが解決されれば、残りのルーティングの問題を解決できる可能性があります。だからここにあります:

ユーザー プロファイルの Twitter のような URL をサポートするには、ルートをどのように登録しますか?

www.twitter.com/username

以下もサポートする必要があると仮定します。

  • デフォルト{controller}/{action}/{id}ルート。

  • 次のような URL:

    www.twitter.com/login
    www.twitter.com/register

これは可能ですか?

4

6 に答える 6

10

どうですか

routes.MapRoute(
    "Profiles",
    "{userName}",
    new { controller = "Profiles", action = "ShowUser" }
);

そして、ProfilesController には関数があります。

public ActionResult ShowUser(string userName)
{
...

この関数では、指定された userName を持つユーザーが見つからない場合、デフォルトの {controller}/{action}/{id} (ここでは単に {controller}) ルートにリダイレクトする必要があります。

www.twitter.com/login のような URL は、その前に登録する必要があります。

routes.MapRoute(
    "Login",
    "Login",
    new { controller = "Security", action = "Login" }
);
于 2008-12-18T08:51:09.490 に答える
4

理解しておくべき重要なことは、ルートは登録された順序で照合されるということです。したがって、最も具体的なルートを最初に登録する必要があり、最も一般的なルートを最後に登録する必要があります。そうしないと、一般的なルートに一致するすべてのリクエストがより具体的なルートに到達することはありません。

あなたの問題については、ユーザー名ルールの前に「登録」や「ログイン」など、特別なページごとにルーティングルールを登録します。

于 2008-12-18T09:01:33.027 に答える
0

あなたの質問は私のものと似ていると思います。ASP.NETMVCルーティング

これはロバートハーベイが答えたものです。

routes.MapRoute( _
    "SearchRoute", _
    "{id}", _
    New With {.controller = "User", .action = "Profile", .id = ""} _

)。

于 2009-11-06T07:57:18.957 に答える
0

標準ルート登録の代替方法を次に示します。

1. RiaLibrary.Web.dllをダウンロードし、ASP.NET MVC Web サイト プロジェクトで参照します。

2. [Url] 属性を使用してコントローラー メソッドを装飾します。

public SiteController : Controller
{
    [Url("")]
    public ActionResult Home()
    {
        return View();
    }

    [Url("about")]
    public ActionResult AboutUs()
    {
        return View();
    }

    [Url("store/{?category}")]
    public ActionResult Products(string category = null)
    {
        return View();
    }
}

ところで、「?」'{?category}' パラメータは、オプションであることを意味します。ルートのデフォルトでこれを明示的に指定する必要はありません。これは次のようになります。

routes.MapRoute("Store", "store/{category}",
new { controller = "Store", action = "Home", category = UrlParameter.Optional });

3. Global.asax.cs ファイルを更新する

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoutes(); // This do the trick
    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

デフォルトと制約の設定方法 例:

public SiteController : Controller
{
    [Url("admin/articles/edit/{id}", Constraints = @"id=\d+")]
    public ActionResult ArticlesEdit(int id)
    {
        return View();
    }

    [Url("articles/{category}/{date}_{title}", Constraints =
         "date=(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")]
    public ActionResult Article(string category, DateTime date, string title)
    {
        return View();
    }
}

注文の設定方法は?例:

[Url("forums/{?category}", Order = 2)]
public ActionResult Threads(string category)
{
    return View();
}

[Url("forums/new", Order = 1)]
public ActionResult NewThread()
{
    return View();
}
于 2010-02-03T23:26:38.173 に答える
0

ホームコントローラーでそれを処理できますが、コントローラーメソッドはあまりエレガントではありません. 私はこのようなものがうまくいくかもしれないと推測しています(テストされていません):

routes.MapRoute(
    "Root",
    "{controller}/{view}",
    new { controller = "Home", action = "Index", view = "" }
);

次に、HomeController で:

public ActionResult Index(string view) {
    switch (view) {
        case "":
            return View();

        case "register":
            return View("Register");

        default: 
            // load user profile view
    }
}
于 2008-12-18T07:51:01.560 に答える
0

OK、これを適切に試したことはありませんが、ユーザーを処理するために RouteBase クラスを拡張しようとしましたか? RouteBaseのドキュメントは、メソッド GetRouteData が現在のリクエストと一致しない場合は null を返す必要があることを示唆しています。これを使用して、リクエストがユーザー名のいずれかと一致することを確認できます。

以下を使用して RouteBase サブクラスを追加できます。

  routes.Add(new UserRouteBase());

ルートを登録するとき。

調べる価値があるかもしれません。

于 2008-12-18T09:04:50.867 に答える