【问题标题】:Overwrite RouteValues from asp-all-route-data in AnchorTagHelper从 AnchorTagHelper 中的 asp-all-route-data 覆盖 RouteValues
【发布时间】:2019-06-13 07:19:47
【问题描述】:

将 TagHelpers 与 MVC Core (2.1) 一起使用时,可以定义 asp-all-route-data 和附加的 asp-route-x。但是如果 x 已经包含在传递给 all-route-data 的对象中,则会引发异常:

An element with the key 'x' already exists in the RouteValueDictionary

是否可以更改此行为(扩展 TagHelper、自定义 TagHelper 等)以在这种情况下仅更新值而不是尝试创建新条目。

所以这个:

if(RouteValueDictionary.HasKey(x)) 
   RouteValueDictionary[x] = value;

而不是(可能类似于)这个:

RouteValueDictionary.Add(x, value);

(基本上,我的代码中的 if 在这样的分配中甚至都不需要)

编辑(也许是为了解释用例):有一个包含表单所有查询参数的对象,但也有一些链接应该基本上发送相同的数据并更改一个值。只有在每个链接都使用带有 onclick 的 javascript、设置隐藏输入并提交表单时,才能提交表单。但我不希望为此使用 JS,因为“中键单击新标签”之类的功能将会丢失。

【问题讨论】:

  • 也许this answer 有帮助?
  • @Tseng 这实际上看起来不错。谢谢

标签: c# asp.net-mvc asp.net-core


【解决方案1】:

Tseng 的回答非常有用,但是如果需要使用 Object 作为 Values 而不是上下文,它可能效果不佳。

最后我们创建了一个只创建查询参数的 TagHelper:

[HtmlTargetElement("a", Attributes = RouteValuesDictionaryName)]
[HtmlTargetElement("a", Attributes = RouteValuesPrefix + "*")]
public class SearchLinkTagHelper : TagHelper
{
    private const string RouteValuesDictionaryName = "my-all-route-data";
    private const string RouteValuesPrefix = "my-route-";
    private const string Href = "href";

    private IDictionary<string, string> _routeValues;

    public override int Order => 1;

    [HtmlAttributeName(RouteValuesDictionaryName, DictionaryAttributePrefix = RouteValuesPrefix)]
    public IDictionary<string, string> RouteValues
    {
        get => _routeValues ?? (_routeValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase));
        set => _routeValues = value;
    }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.Attributes.TryGetAttribute(Href, out var href);

        var fixedRouteValues = new Dictionary<string, string>();
        foreach (var (newKey, value) in _routeValues.Where(r=>!string.IsNullOrWhiteSpace(r.Value)))
        {
            var key = fixedRouteValues.Keys.FirstOrDefault(k => string.Equals(k, newKey, StringComparison.InvariantCultureIgnoreCase)) ?? newKey;
            fixedRouteValues[key] = value;
        }

        var query = string.Join("&", fixedRouteValues.Select(kvp => $"{kvp.Key}={kvp.Value}"));
        var hrefValue = href.Value;
        output.Attributes.Remove(href);
        href = new TagHelperAttribute(Href, hrefValue + "?" +query);
        output.Attributes.Add(href);

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 2021-05-04
    • 2014-02-17
    • 2023-03-16
    相关资源
    最近更新 更多