gpt4 book ai didi

具有任意数量键值对的 ASP.NET 路由 - 可能吗?

转载 作者:行者123 更新时间:2023-12-05 01:08:21 25 4
gpt4 key购买 nike

我想处理这样的网址:

/Id/Key1/Value1/Key2/Value2/Key3/Value3/

现在,我已经设置了这样的规则:
/{id}/{*parameters}
parameters对象作为单个 string 传递参与形成响应的所有操作。这确实有效,但我有一些问题:
  • 每个 Action 都必须解决 string为自己。当然,我已经创建了一个扩展方法,可以将 string 变成到 Dictionary<string, string> ,但如果调度机制给我的方法一个 Dictionary<string, string>,我更喜欢它直接 - 或者更好的是,将实际对作为单独的参数。
  • 操作链接仍将使用传统格式 ( ?Key1=Value1 ) 添加参数。我想我可以用我想要的格式编写专门的帮助程序,但如果有办法让现有的重载遵循上述路由规则,我更喜欢它。

  • 有没有办法做到以上几点?

    最佳答案

    您可以编写自定义路由:

    public class MyRoute : Route
    {
    public MyRoute()
    : base(
    "{controller}/{action}/id/{*parameters}",
    new MvcRouteHandler()
    )
    {
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
    var rd = base.GetRouteData(httpContext);
    if (rd == null)
    {
    return null;
    }

    string parameters = rd.GetRequiredString("parameters");
    IDictionary<string, string> parsedParameters = YourExtensionMethodThatYouAlreadyWrote(parameters);
    rd.Values["parameters"] = parsedParameters;
    return rd;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
    object parameters;
    if (values.TryGetValue("parameters", out parameters))
    {
    var routeParameters = parameters as IDictionary<string, object>;
    if (routeParameters != null)
    {
    string result = string.Join(
    "/",
    routeParameters.Select(x => string.Concat(x.Key, "/", x.Value))
    );
    values["parameters"] = result;
    }
    }
    return base.GetVirtualPath(requestContext, values);
    }
    }

    可以这样注册:
    public static void RegisterRoutes(RouteCollection routes)
    {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add("my-route", new MyRoute());

    routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    }

    现在您的 Controller 操作可以采用以下参数:
    public ActionResult SomeAction(IDictionary<string, string> parameters)
    {
    ...
    }

    就按照这种模式生成链接而言,它很简单:
    @Html.RouteLink(
    "Go",
    "my-route",
    new {
    controller = "Foo",
    action = "Bar",
    parameters = new RouteValueDictionary(new {
    key1 = "value1",
    key2 = "value2",
    })
    }
    )

    或者如果你想要一个 <form> :
    @using (Html.BeginRouteForm("my-route", new { controller = "Foo", action = "Bar", parameters = new RouteValueDictionary(new { key1 = "value1", key2 = "value2" }) }))
    {
    ...
    }

    关于具有任意数量键值对的 ASP.NET 路由 - 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17262553/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com