次のようなルートをマップしたい:
mysite.com/ユーザー名
ASP.NET MVC 3 アプリケーションで。どうすればいいですか?よろしくお願いします。
次のようなルートをマップしたい:
mysite.com/ユーザー名
ASP.NET MVC 3 アプリケーションで。どうすればいいですか?よろしくお願いします。
おそらく、System.Web.Routing.Route から継承するカスタム ルートを最初に追加し、メソッドをオーバーライドします。
protected virtual bool ProcessConstraint(HttpContextBase httpContext, object constraint,
string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
インデックス付きの列を使用してデータベースをチェックインする場所。
次のようなnull不可の制約オブジェクトを追加するだけです
Constraints = new { username = "*" }
ルート オブジェクトが制約を処理するようにします。
データベースにアクセスする前に、これがユーザー名であるかどうか、いくつかのヒューリスティックを作成してください。コントローラーと同じユーザーを持つことはできないことを覚えておいてください(デフォルトアクションがある場合)ので、何らかの形でそれを制限したいと考えています。それが年のパフォーマンスに影響を与えない場合は注意してください。ただし、スラッシュの後に単一の値を持つ多くのルートはおそらくないでしょう。
これがあなたがこれを行う方法です。
public class UserRoute : Route
{
public UserRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
: base(url, defaults, constraints, routeHandler)
{
}
protected override bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.UrlGeneration)
return true;
object value;
values.TryGetValue(parameterName, out value);
string input = Convert.ToString(value, CultureInfo.InvariantCulture);
// check db
if (!CheckHeuristicIfCanBeUserName(input))
{
return false;
}
// check in db if exists,
// if yes then return true
// if not return false - so that processing of routing goes further
return new[] {"Javad_Amiry", "llapinski"}.Contains(input);
}
private bool CheckHeuristicIfCanBeUserName(string input)
{
return !string.IsNullOrEmpty(input);
}
}
これは最初に追加します。
routes.Add(new UserRoute("{username}",
new RouteValueDictionary(){ {"controller", "Home"}, {"action", "About"}},
new RouteValueDictionary(){ { "username", "*" }}, new MvcRouteHandler()));
生成と受信の両方の方法で機能します。
たぶん、このようなものですか?
routes.MapRoute(
"Profile",
"{username}",
new { controller = "Profile", action = "View" }
);
あなたのコントローラーが
public class ProfileController : Controller {
public ActionResult View(string username) {
// ...
}
}