C# 更改url';s查询字符串并保留路由
在“更新”页面上,我有几个类别的“标签”,它们必须是可点击的,可以附加或删除url中的特定标签 因此,有几个标记已定义并由Umbraco填写,每个标记现在都有一个href,该href具有指向控制器中方法的UrlActionC# 更改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
<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);
}
}