6

ユーザーの歩数計エントリを記録するASP.NETMVC3アプリケーションがあります。ユーザーは、にアクセスして最新の歩数計エントリをすべて表示でき、、、、などのURLにアクセスして、年、/Pedometer年/月、または年/月/日付でフィルタリングできます。/Pedometer/2011/Pedometer/2011/08/Pedometer/2011/08/15

で2つのマップされたルートを作成しましたGlobal.asax。以下に示す最初のルートは、日付でフィルタリングするためのさまざまなURLパターンを許可するものです。2番目のルート(図には示されていません)は、デフォルトのASP.NETMVCルートです。

routes.MapRoute(
    "PedometerEntries", // Route name
    "Pedometer/{year}/{month}/{day}", // URL with parameters
    new
    {
        controller = "Pedometer",
        action = "Index",
        year = UrlParameter.Optional,
        month = UrlParameter.Optional,
        day = UrlParameter.Optional
    }, // Parameter defaults
    new
    {
        year = @"\d{4}",
        month = @"([012]?\d{1})?",
        day = @"(([1-9])|([12][0-9])|(3[0-1]))?"
    } // Parameter constraints
);

これが私の質問です。次のフォームのリンクを作成するビューがあります。currentUrl?format=csvこれにより、ユーザーは要求されたURLの歩数計エントリをCSV形式でダウンロードできます。したがって、ユーザーがにアクセスしている/Pedometer場合、ダウンロードリンクはになります/Pedometer?format=csv。ユーザーが/Pedometer/2011/08ダウンロードリンクにアクセスしている場合は、になります/Pedometer/2011/08?format=csv

このようなリンクを作成するためDownloadToExcelに、次のコードで名前が付けられたカスタムHtmlヘルパーを追加しました。

public static MvcHtmlString DownloadToExcel(this HtmlHelper helper, string linkText)
{
    RouteValueDictionary routeValues = helper.ViewContext.RouteData.Values;

    // Add the format parameter to the route data collection, if needed
    if (!routeValues.ContainsKey("format"))
        routeValues.Add("format", "csv");

    return helper.ActionLink(linkText,                          // Link text
                                routeValues["action"].ToString(),  // Action
                                routeValues);                      // Route values
}

ビューにマークアップを追加すると@Html.DownloadToExcel()、リンクが生成されますが、これが摩擦です-ユーザーが最近のエントリまたは年/月または年/月/日付でフィルタリングされたエントリにアクセスすると、期待どおりに機能しますが、ユーザーが年フィルターURLにアクセスします。

次のリストは、ユーザーがアクセスするURLと、カスタムHtmlヘルパーによって生成された対応するURLを示しています。

  • 訪問:/Pedometer-ダウンロードリンク:/Pedometer?format=csv
  • 訪問:/Pedometer/2011-ダウンロードリンク:/Pedometer?year=2011&format=csv
  • 訪問:/Pedometer/2011/08-ダウンロードリンク:/Pedometer/2011/08?format=csv
  • 訪問:/Pedometer/2011/08/15-ダウンロードリンク:/Pedometer/2011/08/15?format=csv

/Pedometer/2011ダウンロードリンクにアクセスするのはなぜ/Pedometer?year=2011&format=csvですか/Pedometer/2011?format=csv?そして、なぜそれはその1つのケースでは機能しないが、年/月および年/月/日付のケースでは期待どおりに機能するのでしょうか。

ありがとう

4

2 に答える 2

6

この問題は、PhilHaackがブログで説明しているこのバグが原因である可能性があります。2つの連続するオプションのURLパラメーターがある場合、ASP.NETMVC3で導入される回帰バグがあります。

于 2011-08-16T23:46:59.217 に答える
4

私はあなたが提供したコードで小さなMVC3アプリケーションを作成し、説明したのとまったく同じ動作をしました。

http:// localhost:51181 / pedometer / 2011にアクセスすると、生成されるリンクはhttp:// localhost:51181 / Pedometer?year = 2011&format=csvになります。

ただし、アクションの名前(インデックス)を明示的に入力すると、正しくレンダリングされます。

http:// localhost:51181 / pedometer / index / 2011にアクセスすると、次のリンクが生成されます。

http:// localhost:51181 / pedometer / index / 2011?format = csv

HtmlHelper拡張メソッドで正しいルートが常に使用されるとは限らないようです。

カスタムルートのすぐ下に、デフォルトのMVCルートの前に次のルートを追加すると、問題なく機能します。

routes.MapRoute(
    "PedometerDefault",
    "Pedometer/{year}",
    new { controller = "Pedometer", action = "Index", 
          year = UrlParameter.Optional }
);
于 2011-08-16T23:32:34.003 に答える