10

非常に単純な質問ですが、これに対する答えが見つかりませんでした。

global.asaxにデフォルトの{controller}/{action}/{id}パターンがあります。

また、MicrosoftとAppleがデータベースに保存されているときに、 www.example.com /microsoftやwww.example.com/appleのようなものが必要です。idデフォルトのパターンを使用すると、次のようになります:www.example.com/brands/detail/microsoft

パターンはどうあるべきか考えていますか?私は試しました:{id}そしてコントローラーとアクションをに設定するbrandsと、detailそれは私のニーズを満たすために機能しますが、他のすべてのパターンを台無しにします。

ありがとう

4

2 に答える 2

6

IDがコントローラーの1つと一致しないか、データベース内のIDの1つと一致する必要があるという制約のある別のルートをお勧めします。資格が満たされている場合は、最初に一致するようにデフォルトルートの前にリストします。

固定制約に単純な正規表現を使用する例。ただし、値を動的に制限するIRouteConstraintから派生したカスタム制約を作成することをお勧めします。

routes.MapRoute(
  "Brands",
  "{id}",
  new { controller = "brand", action = "detail" },
  new { id = "^(Microsoft)|(Apple)$" }
);

その他のアイデアについては、http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspxを参照してください。

于 2012-04-20T01:31:47.740 に答える
5

ルートの順序が重要です。したがって、使用可能なすべてのコントローラーを処理する最初のルート定義を作成してから、残りの要求を処理するルート定義について言及します。そこであなたはそのwww.yousite.com/apple種の要求を処理します

routes.MapRoute("Default",  // Route name
                  "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Home", action = "Index", id = "" },
                    new { controller = new FromValuesListConstraint("Home", "Account","OtherOne") }
                );

 // to handle personalize user url
routes.MapRoute("user","{url}", new {controller="Home",action="Profile",url = "" });

FromValuesListContraint次に、IRouteConstraintから継承するという新しいクラスを作成します。

public class FromValuesListConstraint : IRouteConstraint
{
    private string[] _values;

    public FromValuesListConstraint(params string[] values)
    {
        this._values = values; 
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName,
    RouteValueDictionary values, RouteDirection routeDirection)
    {
        // Get the value called "parameterName" from the
        // RouteValueDictionary called "value"

        string value = values[parameterName].ToString();

        // Return true is the list of allowed values contains
        // this value.

        for (int i = 0; i < _values.Length; i++)
            if (SContains(_values[i], value, StringComparison.OrdinalIgnoreCase ))
                return true;

        return false;
    }    

    public bool SContains(string source, string toCheck, StringComparison comp)
    {
        return source.IndexOf(toCheck, comp) >= 0;
    }
}

ホームのProfileアクションメソッドにパラメーター値を読み取らせ、データベースからデータを取得します。

 public ActionResult Profile(string url)
 {
    //url variable will have apple or microsoft . You may get data from db and return a view now.
 }

したがって、リクエストが来るたびに、それが利用可能なコントローラー(最初のルート定義でFromValuesListContraintクラスコンストラクターに渡したもの)であるかどうかをチェックし、利用可能な場合はそのルーティングに進み、そうでない場合は一般的な(デフォルト)2番目のルートとして言及されているルート。

この例では、Home、Account、およびOtherOnesが使用可能なコントローラーです。プロジェクトに新しいコントローラーを追加するときはいつでも、それをFromValuesListConstraintクラスコンストラクターのコンストラクターに追加する必要があります。

特定の例外をキャッチし、いずれもキャッチされない場合は一般的な例外に進むように機能すると言うだけです。:)(理解するための単なる例)

于 2012-04-20T01:44:20.697 に答える