更改网址的查询字符串并保留路由

时间:2018-08-20 12:54:06

标签: c# asp.net-mvc umbraco asp.net-mvc-5.2

在“更新”页面上,我有几个类别的“标签”,这些标签必须是可单击的,它们会附加或删除网址中的特定标签。

因此,已定义了多个标记并将其填充到Umbraco中,每个标记现在都有一个href,该href对控制器中的方法具有UrlAction。

<a href="@Url.Action("RedirectToIndex", "Blog", new { tags = tag} )"  class="filters__link @Umbraco.If(Model.IsTagActive(tag), "selected")"><i class="material-icons">local_offer</i>@tag</a></li>

我现在有一个带有硬编码网址的重定向操作:

 public ActionResult RedirectToIndex(string tags)
    {

        // build the URL string here but remember what the URL was previously??

        var url = "http://localhost:4166/updates?" + "tags=" + tags;

        return Redirect(url);
    }

我得到的URL字符串是一种奇怪的'_internal/Blog/' URL,每次单击过滤器都会改变它。

我想发生的事情是,当用户单击标签时,URL会更改为相应的'updates?tags=firstTag&tags=secondTag'(基本上是使用其他参数重定向到自己的地址),依此类推,然后控制器的索引具有相应的“过滤器”代码来过滤博客并与这些博客一起返回。我必须进行完全重新加载,因为包含所有博客的模型都来自Umbraco,并且我看不到没有添加很多(不必要的)复杂代码的访问方法。

public ActionResult Index(RenderModel model, [FromUri]string[] tags)
        {
           //filter code is here 
            return CurrentTemplate(blogModel);
        }

每当点击标签时,我都希望重新加载整个页面,而我唯一需要弄清楚的是如何构建URL。

我查看了添加on click事件(服务器端),但是随后收到错误消息,该功能无法识别。

我觉得此“问题”有多种解决方案,我正在尝试找出最佳选择。你能帮我吗?

1 个答案:

答案 0 :(得分:0)

建立包含过滤器系统的网站时,我有相同的要求,并编写了一些扩展方法来帮助我:
以下是一些使用示例:

  • 是否要更改参数的值(或添加新的参数)?例如localhost/index?tag=one,并且您希望它成为localhost/index?tag=two&v=1,然后使用Url.RouteWithSameQueryParams(new { tag = "two", v = 1 })
  • 是否想为参数添加值?例如localhost/index?tag=one,并且您希望它成为localhost/index?tag=one&tag=two&tag=three,然后使用Url.RouteWithAddedValues("tag", "two", "three")
  • 您要删除参数值吗?例如localhost/index?tag=one&tag=two,并且您希望它成为localhost/index?tag=one,然后使用Url.RouteWithoutValue("tag", "two")

这是我的扩展程序类:

public static class UrlHelperExtensions
{

    public static string RouteWithSameQueryParams(this IUrlHelper url, object routeValues)
    {
        var resultRouteValues = new RouteValueDictionary(url.ActionContext.RouteData.Values);

        foreach (var queryValue in url.ActionContext.HttpContext.Request.Query)
        {
            resultRouteValues.Add(queryValue.Key, queryValue.Value);
        }

        if (routeValues == null)
            return url.RouteUrl(resultRouteValues);

        foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(routeValues))
        {
            if (resultRouteValues.ContainsKey(descriptor.Name))
            {
                resultRouteValues[descriptor.Name] = descriptor.GetValue(routeValues);
            }
            else
            {
                resultRouteValues.Add(descriptor.Name, descriptor.GetValue(routeValues));
            }
        }

        return url.RouteUrl(resultRouteValues);
    }

    public static string RouteWithoutValue(this IUrlHelper url, string param, string value)
    {
        var resultRouteValues = new RouteValueDictionary(url.ActionContext.RouteData.Values);

        foreach (var queryValue in url.ActionContext.HttpContext.Request.Query)
        {
            if (queryValue.Key.ToLower() == param)
            {
                if (value != null)
                    resultRouteValues.Add(queryValue.Key, new StringValues(queryValue.Value.Where(s => s != value).ToArray()));
            }
            else
                resultRouteValues.Add(queryValue.Key, queryValue.Value);
        }

        return url.RouteUrl(resultRouteValues);
    }

    public static string RouteWithAddedValues(this IUrlHelper url, string param, params string[] values)
    {
        var resultRouteValues = new RouteValueDictionary(url.ActionContext.RouteData.Values);

        foreach (var queryValue in url.ActionContext.HttpContext.Request.Query)
        {
            if (queryValue.Key.ToLower() == param)
            {
                var vals = new List<string>(queryValue.Value);
                vals.AddRange(values);
                resultRouteValues.Add(queryValue.Key, new StringValues(vals.ToArray()));
            }
            else
            {
                resultRouteValues.Add(queryValue.Key, queryValue.Value);
            }
        }

        if (!resultRouteValues.ContainsKey(param))
        {
            resultRouteValues.Add(param, new StringValues(values));
        }

        return url.RouteUrl(resultRouteValues);
    }

}