0
私がしたいのは、Facebookのプロフィールページ(facebook.com/username)と同じです。同じことをしたいのですが、www.myapplication/username、ルーティングがありますか方法 ??同じコントローラで複数のルーティングを行う方法
私がしたいのは、Facebookのプロフィールページ(facebook.com/username)と同じです。同じことをしたいのですが、www.myapplication/username、ルーティングがありますか方法 ??同じコントローラで複数のルーティングを行う方法
プロファイルページにルーティングするには、ユーザー名の有効性をチェックするRouteConstraintを持つルートが必要です。あなたのルートは最初のルートでなければならない、とGlobal.asax.csでRegisterRoutesは次のようになります。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Profiles", // Route name
"{username}", // URL
new { controller = "Profile", action = "Index" }, // Parameters
new { username = new MustBeUsername() }
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
を次に、あなたが提出されたユーザー名が有効であることを確認するようにデータベースをチェックしますRouteConstraintクラスを作成する必要があります。
using System;
using System.Web;
using System.Web.Routing;
namespace ExampleApp.Extensions
{
public class MustBeUsername : IRouteConstraint
{
public MustBeUsername() { }
private DbContext _db = new DbContext();
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return (_db.Users.Where(u => u.Username == values[parameterName].ToString()).Count() > 0);
}
}
}
counsellorben
ご返信いただきありがとうございますが、どのような場合、私はあなたのコードを試してみましたが、いくつかの変更を加えました。私はセッションで私のユーザーを取得しているので、最初にロードするときに例外(nullポインタ)を持っていました。条件が満たされたら、それをスキップします。一度呼び出されたglobal.asaxとして再び内部に入りません。助言 –
誰かがプロフィールにアクセスしている場合、一般的にプロフィールを作成したユーザーではないため、Sessoinはあなたのルートを検証するための正しい情報を含んでいません。ルートの有効性を確認する唯一の方法は、ユーザーデータベースを使用する方法です。 – counsellorben
はい、あなたはFacebookにいますが、プロフィールをクリックするとTwitterはそれを行います。このリンクを取得します。http://twitter.com/#!/YourUserName –