2017-09-15 59 views
0

我想定义与操作筛选站点地图节点,例如:用行动MVC 5定义地图节点过滤器

[SitemapUrl(Frequency = Frequency.Monthly, Priority = 0.9)] 
public ActionResult About() 
{ 
    return View(); 
} 

这将产生如下:

<url> 
    <loc>https://www.example.com/home/about</loc> 
    <changefreq>monthly</changefreq> 
    <priority>0.9</priority> 
</url> 

它会被添加到一个包含所有sitemap节点的集合,在需要时生成到sitemap.xml ...

我在想我们使用“RouteAttribute”的相同行为。

我该如何执行此操作?

回答

1

这里是你可以在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); 
    } 
} 

知道你将如何保存和一个项目检查,如果不存在的话,因为这将是一些自定义的,但我认为下一步很容易。 如果您还有什么不清楚的地方,请告诉我!

+0

谢谢,但你如何通过反射获取RouteValues或QueryString? –

+0

为什么你想使用反射,当你可以轻松地使用UrlHelper? –

+0

我需要在一些站点地图URL的动作中的查询字符串参数,无论如何我解决了它,通过修改为:'新的 {动作= x.Name, 控制器= x.DeclaringType?.Name.Replace(“Controller “), RouteValues = new RouteValueDictionary(x.GetParameters()。ToDictionary(key => key.Name,value => value.DefaultValue)), Priority = x.GetCustomAttribute