2

DjangoベースのWebアプリに次のようなURLがあります。

/market/prices/2011-05-01/min/stocks/msft/dell/appl/

アプリケーションはASP.NETMVC3で書き直されています。URLを維持する必要があります

問題の核心は、スラッシュで区切られた複数の株式ティッカーシンボルをサポートすることです。

次のようなカスタムルートが必要です。

routes.MapRoute(
    "Stocks",
    "{queryDate}/{minOrMax}/stocks/{listOfStocksSeparatedByForwardSlash}",
    new { controller = "Market", action = "Prices" }
);

コントローラは次のようになります。

public ActionResult Prices(string queryDate, string minOrMax, ICollection<string> listOfStocksSeparatedByForwardSlash) {
    var model = repository.List(queryDate, minOrMax, listOfStocksSeparatedByForwardSlash);
    return View(model );
}

私の現在の解決策は次のとおりです。

routes.MapRoute(
    "Stocks",
    "{queryDate}/{minOrMax}/stocks/{*listOfStocksSeparatedByForwardSlash}",
    new { controller = "Market", action = "Prices" }
);

public ActionResult Prices(string queryDate, string minOrMax, string listOfStocksSeparatedByForwardSlash) {
    var list = listOfStocksSeparatedByForwardSlash.Split('/').ToList();
    var model = repository.List(queryDate, minOrMax, list);
    return View(model );
}

これは機能しますが、これを行うためのより良い方法があるかどうか知りたいですか?

4

1 に答える 1

0

さて、これはオプションですが、あなたのアプローチはより簡単だと思います。

次のように、ルートにアタッチされたRouteHandlerを提供できます。


routes.MapRoute(
    name: "Test",
    url: "Test/{someDate}/{*tickerSymbols}",
    defaults: new { controller = "Home", action = "Test" }).RouteHandler = new SlashSeparatedTrailingParametersRouteHandler("tickerSymbols", "tickers");

ルートハンドラーは


public class SlashSeparatedTrailingParametersRouteHandler : IRouteHandler
{
    private readonly string catchallParameterName;
    private readonly string actionTargetParameter;

    public SlashSeparatedTrailingParametersRouteHandler(string catchallParameterName, string actionTargetParameter)
    {
        this.catchallParameterName = catchallParameterName;
        this.actionTargetParameter = actionTargetParameter;
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        if (requestContext == null)
        {
            throw new ArgumentNullException("requestContext");
        }

        IRouteHandler handler = new MvcRouteHandler();
        var vals = requestContext.RouteData.Values;
        vals[this.actionTargetParameter] = vals[this.catchallParameterName].ToString().Split('/');
        return handler.GetHttpHandler(requestContext);
    }
}

これがコントローラーのアクションである場合:


[HttpGet]
public ActionResult Test(DateTime someDate, string[] tickers)
{
    if (tickers == null)
    {
        throw new ArgumentNullException("tickers");
    }

    return Content(string.Format("{0} and {1}", someDate, tickers.Length.ToString(CultureInfo.InvariantCulture)));
}

そしてこれはあなたの投稿です:


http://localhost/Test/12-06-2012/Foo/Bar

その場合、出力は次のようになります。


12/6/2012 12:00:00 AM and 2

エレガンスでは、これにより、独自のルートハンドラーを作成する必要がありますが、アクションメソッドのパラメーターが改善されます。

于 2012-05-04T15:30:55.257 に答える