在“更新”页面上,我有几个类别的“标签”,这些标签必须是可单击的,它们会附加或删除网址中的特定标签。
因此,已定义了多个标记并将其填充到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事件(服务器端),但是随后收到错误消息,该功能无法识别。
我觉得此“问题”有多种解决方案,我正在尝试找出最佳选择。你能帮我吗?
答案 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);
}
}