4

次のようなルートをマップしたい:

mysite.com/ユーザー名

ASP.NET MVC 3 アプリケーションで。どうすればいいですか?よろしくお願いします。

4

2 に答える 2

2

おそらく、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()));

生成と受信の両方の方法で機能します。

于 2011-07-03T00:39:44.007 に答える
1

たぶん、このようなものですか?

routes.MapRoute(
    "Profile",
    "{username}",
    new { controller = "Profile", action = "View" }
);

あなたのコントローラーが

public class ProfileController : Controller {

    public ActionResult View(string username) {
       // ...
    }

}
于 2011-07-02T03:41:32.547 に答える