【问题标题】:Migrate custom route to ASP.NET MVC custom route to support List<string>将自定义路由迁移到 ASP.NET MVC 自定义路由以支持 List<string>
【发布时间】:2012-04-18 12:29:34
【问题描述】:

我在一个基于 Django 的 Web 应用程序中有一个与此类似的 URL:

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

应用程序正在用 ASP.NET MVC 3 重写。我需要维护 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 );
}

虽然这可行,但我很想知道是否有更好的方法来做到这一点?

【问题讨论】:

  • 我认为您当前的解决方案是最简洁的方法,尽管我准备被证明是错误的。

标签: asp.net-mvc-3 asp.net-mvc-routing


【解决方案1】:

好的,这是一个选项,尽管我认为您的方法更容易。

您可以提供附加到路由的 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

在优雅方面,这改进了 action 方法的参数,但代价是必须编写自己的路由处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多