1

UserName(変更可能)用のルートとUserId用のルートを設定するオプションが必要です。Users/{UserName}このようにして、ユーザーは、決して変更されないことが保証されるURLとともに、覚えやすいURLの利点を得ることができます。Users/{UserId}

ユーザーをベースとするルートごとに2つのルートを作成する必要を回避する方法はありますか?

コメントから編集

メソッドでもこれを処理することは避けたいと思います。私はむしろルーティングでそれを処理したいと思います。

4

2 に答える 2

0

リクエストが UserId または UserName で渡されているかどうかを判断するには、入力パラメーターが int か文字列かを判断する必要があります。これには 2 つのオプションがあります。

  1. アクションメソッドで判断する
  2. ルーティングで決定します。

アクション メソッドで判断を下せば、これらの両方のケースを 1 つのルートで処理できます。これを処理するには、次のようにルートを設定します。

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

次に、Home コントローラーの Index アクション メソッドで、次のコードを使用して、入力パラメーターが int か文字列かを確認する必要があります。

public ActionResult Index(string userSpecifier)
{
    int userId = 0;
    if(int.TryParse(userSpecifier, out userId))
    {
        //It is an int, and userId contains the user Id, so process accordingly
    }
    else
    {
        //It is not an int, so treat userSpecifier as username and process accordingly
    }
    ....

    return View();
}

そのため、「userSpecifier」入力パラメーターに渡された文字列を int に変換できる場合は、それが UserId であると想定して、それに応じて処理できます。int に変換できない場合は、それが UserName であると想定し、それに応じて対応できます。

もちろん、このソリューションは、UserId が int で UserName が文字列であるという前提に基づいています。これは、ほとんどのアプリケーションが設定される方法です。

代わりにルーティングでこの決定を行いたい場合は、2 つのルートを設定し、ルート制約を使用して 1 つのルートを制約して整数の入力パラメーターを処理し、2 つ目のルートを制約して文字列の入力パラメーターを処理する必要があります。 .

于 2013-03-03T21:14:54.057 に答える
0

最初に、なぜ両方で参照する必要があるのか​​ を尋ねることから始めると思いますか? これが Web API ルート (つまり、安静) である場合、通常、ユーザー API 呼び出しに対して get メソッドは 1 つしかありません。もちろん、あなたのしていることが間違っていると言っているわけではありません!ユーザーを取得する 2 つの方法が本当に必要かどうかを尋ねているだけです。

于 2013-03-11T18:23:50.207 に答える