using Infrastructure.Web.Mvc; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using System.Reflection; namespace System.ComponentModel.DataAnnotations { public class AjaxSelectAttribute : UIHintAttribute, IClientModelValidator { public string Action { get; } public string Controller { get; } public string Area { get; } protected RouteValueDictionary RouteData { get; } = new RouteValueDictionary(); public AjaxSelectAttribute(string action, string controller, string area = null) : base("AjaxSelect") { this.Action = action; this.Controller = controller; this.Area = area; } public void AddValidation(ClientModelValidationContext context) { var key = "data-ajax-url"; var value = GetUrl(context); var attributes = context.Attributes; if (!attributes.ContainsKey(key)) { attributes.Add(key, value); } } private string GetUrl(ClientModelValidationContext context) { var scope = (context.ActionContext.ActionDescriptor as ControllerActionDescriptor) .ControllerTypeInfo .GetCustomAttribute(); var url = context.ActionContext.HttpContext.RequestServices.GetRequiredService() .GetUrlHelper(context.ActionContext).Action(Action, Controller, new { area = Area, range = scope?.Scope }); return url; } } }