Есть ли способ динамически установить asp-route-{value} на основе свойства модели?

avatar
mlst
8 августа 2021 в 19:34
103
1
1

Я хочу сгенерировать тег привязки, который берет всю необходимую информацию из модели. Итак, в представлении страницы Razor у меня сейчас что-то вроде этого:

    <a asp-page="/Reports/LastPeriod"
       asp-route-fromtime="@DateTimeOffset.UtcNow.AddDays(-30).ToString("yyyy-MM-dd")"
    >Last 30 days
    </a>

Я хочу реорганизовать эту привязку таким образом, чтобы она отображалась динамически из модели, которая выглядит следующим образом:

    public class LinkTag {
        public Title { get; set; }
        public Page { get; set; }
    }

Теперь возможно ли как-то отрендерить asp-route-fromtime из модели? Это означало бы, что мне нужно было бы добавить пары ключ-значение в модель, которая будет отображаться в: asp-route-{key}={value}

Например. если я добавлю свойство RouteValues следующим образом:

    public class LinkTag {
        public Title { get; set; }
        public Page { get; set; }
        public Dictionary<string,string> RouteValues { get; set; }
    }

Есть ли способ динамически сопоставить это свойство с набором атрибутов asp-route-{key}={value} для тега <a> в представлении страницы Razor?

Источник

Ответы (1)

avatar
Michael
8 августа 2021 в 20:52
0

Вы можете создать одно значение маршрута, если вы сериализуете свой словарь.

public class LinkTag
{
    public string Title { get; set; }
    public string Page { get; set; }
    public Dictionary<string, string> RouteValues = new();

    public string RouteValue
    {
        get
        {
            var serialized = System.Text.Json.JsonSerializer.Serialize(RouteValues);
            return Convert.ToBase64String(Encoding.UTF8.GetBytes(serialized))
                .Replace("+", "-").Replace("/", "_").Replace("=", ""); // URL safe Base64
        }
        set
        {
            int len = value.Length;
            // Restore padding and convert to standard Base64
            var base64Encoded = value.Replace("_", "/").Replace("-", "+") + new string('=', (4 - len % 4) % 4);
            var serialized = Convert.FromBase64String(base64Encoded);
            RouteValues = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, string>>(serialized) ?? new();
        }
    }
}