2017-09-15 6 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.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のアクションにクエリ文字列パラメータが必要でしたが、これに変更して解決しました: 'new { Action = x.Name、 コントローラ= x.DeclaringType?.Name.Replace(" Controller 優先度= x.GetCustomAttribute key.Name、value => value.DefaultValue))、 ) ' –

関連する問題