0

我在 global.asax 中定义了以下路线

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

我无法控制用户是使用“/useraccount/edit/1”还是“/useraccount/edit?id=1”访问页面。使用 UrlHelper Action 方法生成 url 时,如果 id 作为查询字符串参数传递,则 id 值不包含在 RouteData 中。

new UrlHelper(helper.ViewContext.RequestContext).Action(
                            action, helper.ViewContext.RouteData.Values)

我正在寻找一种一致的方式来访问 id 值,无论使用哪个 url 来访问页面,或者自定义 RouteData 对象的初始化,以便它检查 QueryString 是否缺少路由参数并添加它们如果他们被发现。

4

3 回答 3

2

您可以使用

@Url.RouteUrl("Default", new { id = ViewContext.RouteData.Values["id"] != null ? ViewContext.RouteData.Values["id"] : Request.QueryString["id"] })
于 2016-02-05T14:36:30.707 回答
0

扩展路线最终成为满足我需求的最简单的解决方案;感谢你的建议!让我知道我的解决方案是否有任何明显的问题(除了类名)。

框架路由.cs

public class FrameworkRoute: Route
{
    public FrameworkRoute(string url, object defaults) :
        base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    {
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);
        if (routeData != null)
        {
            foreach (var item in routeData.Values.Where(rv => rv.Value == UrlParameter.Optional).ToList())
            {
                var val = httpContext.Request.QueryString[item.Key];
                if (!string.IsNullOrWhiteSpace(val))
                {
                    routeData.Values[item.Key] = val;
                }
            }
        }

        return routeData;
    }
}

全球.asax.cs

protected override void Application_Start()
{
       // register route
       routes.Add(new FrameworkRoute("{controller}/{action}/{id}", new { controller = "Portal", action = "Index", id = UrlParameter.Optional }));
于 2016-02-08T19:04:10.787 回答
0

试试这个解决方案

  var qs = helper.ViewContext
                .HttpContext.Request.QueryString
                .ToPairs()
                .Union(helper.ViewContext.RouteData.Values)
                .ToDictionary(x => x.Key, x => x.Value);

            var rvd = new RouteValueDictionary(qs);

            return new UrlHelper( helper.ViewContext.RequestContext).Action(action, rvd);

转换 NameValueCollection 试试这个

public static IEnumerable<KeyValuePair<string, object>> ToPairs(this NameValueCollection collection)
        {
            if (collection == null)
            {
                throw new ArgumentNullException("collection");
            }

            return collection.Cast<string>().Select(key => new KeyValuePair<string, object>(key, collection[key]));
        }
于 2016-02-05T14:38:08.187 回答