这里是你可以在StartUp
类做什么:
假设你有一个简单的属性:
public class SitemapUrlAttribute : Attribute
{
public double Priority {get;set;}
public SitemapUrlAttribute(double priority) { Priority = priority; }
}
在启动类做如下得到与此属性的所有操作:
Assembly asm = Assembly.GetExecutingAssembly();
var controllerActionlist = asm.GetTypes()
.Where(type => typeof(Controller).IsAssignableFrom(type))
.SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly |
BindingFlags.Public))
.Where(m => !m.GetCustomAttributes(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute),
true).Any())
.Where(m => m.GetCustomAttribute<SitemapUrlAttribute>() != null)
.Select(
x =>
new
{
Controller = x.DeclaringType.Name,
Area = x.DeclaringType.FullName,
Action = x.Name,
ReturnType = x.ReturnType.Name,
Priority = x.GetCustomAttribute<SitemapUrlAttribute>().Priority
})
.ToList();
现在您拥有列表中的优先级数据的控制器列表:
这里是保存在XML文件中的数据的代码:我不
var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
foreach (var action in controllerActionlist)
{
var url = urlHelper.Action(action.Action, action.Controller, new {area = action.Area});
var priority = action.Priority;
if (something.DoesNotExist(url, priority))
{
Add(url, priority);
}
}
知道你将如何保存和一个项目检查,如果不存在的话,因为这将是一些自定义的,但我认为下一步很容易。 如果您还有什么不清楚的地方,请告诉我!
谢谢,但你如何通过反射获取RouteValues或QueryString? –
为什么你想使用反射,当你可以轻松地使用UrlHelper? –
我需要在一些站点地图URL的动作中的查询字符串参数,无论如何我解决了它,通过修改为:'新的 {动作= x.Name, 控制器= x.DeclaringType?.Name.Replace(“Controller “), RouteValues = new RouteValueDictionary(x.GetParameters()。ToDictionary(key => key.Name,value => value.DefaultValue)), Priority = x.GetCustomAttribute