using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using System.Collections.Generic; namespace System.ComponentModel.DataAnnotations { public class AjaxSelectAttribute : UIHintAttribute, IClientModelValidator { protected string RouteName { get; set; } protected RouteValueDictionary RouteData { get; } = new RouteValueDictionary(); public AjaxSelectAttribute(string action, string controller, string areaName = null) : base("AjaxSelect") { if (action != null) { RouteData["action"] = action; } if (controller != null) { RouteData["controller"] = controller; } if (controller != null) { RouteData["area"] = areaName; } } public void AddValidation(ClientModelValidationContext context) { MergeAttribute(context.Attributes, "data-ajax-url", GetUrl(context)); } private string GetUrl(ClientModelValidationContext context) { return context.ActionContext.HttpContext.RequestServices.GetRequiredService() .GetUrlHelper(context.ActionContext).RouteUrl(new UrlRouteContext { RouteName = RouteName, Values = RouteData }); } private static void MergeAttribute(IDictionary attributes, string key, string value) { if (!attributes.ContainsKey(key)) { attributes.Add(key, value); } } } }