Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改url';s查询字符串并保留路由_C#_Asp.net Mvc_Umbraco_Asp.net Mvc 5.2 - Fatal编程技术网

C# 更改url';s查询字符串并保留路由

C# 更改url';s查询字符串并保留路由,c#,asp.net-mvc,umbraco,asp.net-mvc-5.2,C#,Asp.net Mvc,Umbraco,Asp.net Mvc 5.2,在“更新”页面上,我有几个类别的“标签”,它们必须是可点击的,可以附加或删除url中的特定标签 因此,有几个标记已定义并由Umbraco填写,每个标记现在都有一个href,该href具有指向控制器中方法的UrlAction <a href="@Url.Action("RedirectToIndex", "Blog", new { tags = tag} )" class="filters__link @Umbraco.If(Model.IsTagActive(tag), "selecte

在“更新”页面上,我有几个类别的“标签”,它们必须是可点击的,可以附加或删除url中的特定标签

因此,有几个标记已定义并由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>
我得到的URL字符串是一种奇怪的
“\u internal/Blog/”
类型的URL,它会随着每次过滤器点击而改变(当然)

我想做的是,当用户点击一个标签时,url会随着相应的
更新而改变?tags=firstTag&tags=secondTag'
(基本上是通过附加参数重定向到他自己的地址)等等,然后,控制器的索引具有相应的“过滤器”代码来过滤博客并将其与这些博客一起返回。我必须完全重新加载,因为包含所有博客的模型都来自Umbraco,我看不到不添加大量(不必要的)复杂代码就可以访问它的方法

public ActionResult Index(RenderModel model, [FromUri]string[] tags)
        {
           //filter code is here 
            return CurrentTemplate(blogModel);
        }
我希望每次点击标签时都能重新加载整个页面,我唯一需要弄清楚的是如何构建URL

我已经查看了添加点击事件(服务器端),但随后收到一个错误,该函数无法识别


我觉得这个“问题”有多种解决方案,我正试图找出最好的选择。你能帮我吗?

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

  • 要更改参数的值(或添加新参数)?e、 g.
    localhost/index?tag=one
    并希望它变成
    localhost/index?tag=two&v=1
    然后使用
    Url.RouteWithSameQueryParams(新的{tag=“two”,v=1})
  • 要向参数添加值吗?e、 g.
    localhost/index?tag=one
    并且您希望它成为
    localhost/index?tag=one&tag=two&tag=two
    ,然后使用
    Url.routeWithAddedValue(“tag”、“two”、“three”)
  • 是否要删除参数的值?e、 g.
    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);
    }

}
公共静态类UrlHelperExtensions
{
公共静态字符串RouteWithSameQueryParams(此IUrlHelper url,对象RouteValue)
{
var resultRouteValues=新的RouteValueDictionary(url.ActionContext.RouteData.Values);
foreach(url.ActionContext.HttpContext.Request.Query中的变量queryValue)
{
添加(queryValue.Key,queryValue.Value);
}
if(routeValues==null)
返回url.RouteUrl(resultRouteValues);
foreach(TypeDescriptor.GetProperties(RouteValue)中的PropertyDescriptor描述符)
{
if(resultRouteValues.ContainsKey(descriptor.Name))
{
resultRouteValues[descriptor.Name]=descriptor.GetValue(routeValues);
}
其他的
{
Add(descriptor.Name,descriptor.GetValue(routeValue));
}
}
返回url.RouteUrl(resultRouteValues);
}
公共静态字符串RouteWithoutValue(此IUrlHelper url、字符串参数、字符串值)
{
var resultRouteValues=新的RouteValueDictionary(url.ActionContext.RouteData.Values);
foreach(url.ActionContext.HttpContext.Request.Query中的变量queryValue)
{
if(queryValue.Key.ToLower()==param)
{
if(值!=null)
Add(queryValue.Key,newstringvalues(queryValue.Value.Where(s=>s!=Value.ToArray());
}
其他的
添加(queryValue.Key,queryValue.Value);
}
返回url.RouteUrl(resultRouteValues);
}
公共静态字符串RouteWithAddedValue(此IUrlHelper url、字符串参数、参数字符串[]值)
{
var resultRouteValues=新的RouteValueDictionary(url.ActionContext.RouteData.Values);
foreach(url.ActionContext.HttpContext.Request.Query中的变量queryValue)
{
if(queryValue.Key.ToLower()==param)
{
var VAL=新列表(queryValue.Value);
VAL.AddRange(值);
添加(queryValue.Key,新字符串值(vals.ToArray());
}
其他的
{
添加(queryValue.Key,queryValue.Value);
}
}
如果(!resultRouteValues.ContainsKey(param))
{
添加(参数,新字符串值(值));
}
返回url.RouteUrl(resultRouteValues);
}
}

好奇,我是否遗漏了一些东西,但不确定
IUrlHelper
新的StringValues
,它们是否都适用于新的.Core版本?不幸的是,这仍然是一个旧版本。我现在将适当的版本添加到我的标记中。问这个问题时,我把.core标签留下是有原因的。谢谢你的帮助,也许我可以用这个。
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);
    }

}