加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

具有任意数量的键值对的ASP.NET路由 – 是否可能?

发布时间:2020-12-16 06:26:50 所属栏目:asp.Net 来源:网络整理
导读:我想处理这样的网址: /Id/Key1/Value1/Key2/Value2/Key3/Value3/ 现在,我已经建立了这样的规则: /{id}/{*parameters} 参数对象作为单个字符串传递给形成响应所涉及的所有操作.这确实有效,但我遇到了一些问题: 每个操作都必须为自己解析字符串.当然,我已经
我想处理这样的网址:

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

现在,我已经建立了这样的规则:

/{id}/{*parameters}

参数对象作为单个字符串传递给形成响应所涉及的所有操作.这确实有效,但我遇到了一些问题:

>每个操作都必须为自己解析字符串.当然,我已经制作了一个扩展方法,将字符串转换为字典< string,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 }
    );
}

现在您的控制器操作可以采用以下参数:

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",parameters = new RouteValueDictionary(new { key1 = "value1",key2 = "value2" }) }))
{
    ...    
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读