6

日時として2つのパラメーターを取る属性ルートを定義しました

  [Route("{controller}/{action}/{*startDate:datetime}/{*endDate:datetime}")]
        public bool OverView(DateTime startDate,DateTime endDate)
        {
            var dt = startDate.ToString("yyyy-MM-dd");
            return true;
        }

しかし、それがどのように可能かはわかりません。属性ルートは単一のパラメーターに対しては正常に機能しますが、2 つのパラメーターに対してどのように機能するかはわかりません。また、URL から 2 つのパラメーターを区別する方法を知ることは困難です。

正常に動作する単一のパラメーター

http://domain.com/Home/overview/2014/02/01

2 つのパラメーターの URL はどうなりますか? 以下を試しましたが、例外が発生しました

http://domain.com/Home/overview/2014/02/01/2014/02/04

Exception
A catch-all parameter can only appear as the last segment of the route URL.
Parameter name: routeUrl
4

1 に答える 1

7

最初の可能性

それらがURLセグメント区切り文字であるため以外の方法で日付をフォーマットする必要があります/...そして、MVCが複数の貪欲なセグメントをサポートしている場合でも、間に少なくとも1つの静的セグメントが必要であるため、ルーティングは1つの終わりと2番目の場所を区別できます開始します。

したがって、表記を次のように置き換えると、

/home/overview/2014/02/01

/home/overview/2014-02-01

現在のルーティングはほとんどdatetime機能し、ルート パラメーターは型インスタンスにバインドされたモデルを簡単に取得できます。アクション メソッドのルート宣言は次のようになります。

[Route("{controller}/{action}/{startDate:datetime?}/{endDate:datetime?}")]
public ActionResult OverView(DateTime? startDate, DateTime? endDate)
{
    ...
}

したがって、この変更 (/への変更-) を受け入れることができる場合、カスタマイズ コード (つまり、カスタム モデル バインダー) を記述する必要がないため、これが最も簡単な解決策です。

第二の可能性

貪欲なルート パラメータを 1 つ用意し、手動で解析します。セグメント数は 0、3、または 6 です。それらを手動で解析できるはずです。

[Route("{controller}/{action}/{*dateRange}")]
public ActionResult Overview(string dateRange)
{
    int numberOfSegments = dateRange.Split('/').Length;

    if (dateRange.EndsWith("/"))
    {
        numberOfSegments--;
    }

    switch (numberOfSegments)
    {
        case 0:
            // no dates provided
            ...
            break;
        case 3:
            // only one date provided
            ...
            break;
        case 6:
            // two dates privided
            ...
            break;
        default:
            // invalid number of route segments
            ...
            break;
    }
}
于 2014-02-06T23:12:10.527 に答える