我可以在不编写过滤器的情况下向控制器方法添加自定义属性吗?

时间:2014-10-08 16:51:46

标签: asp.net-mvc

我想为我的控制器方法添加属性,可以使用反射检查。

我可以通过编写一个过滤器看到如何做到这一点,如果这是实现我想要的唯一方法,我会写一个空过滤器,但我真正想要的是一个反射可见的属性,它可以用于生成文档。例如:

    [OperatorFriendlyDescription("Begin a new message from a letter template and set initial properties.")]
    public ActionResult Create(string editorName, int mastKey, ...)

有没有办法在不编写新过滤器的情况下获取我的OperatorFriendlyDescription属性?

(或者,是否有其他方法或文档功能允许我为各个控制器方法设置一个操作员友好名称并使用反射检索它?)

2 个答案:

答案 0 :(得分:2)

是。可以使用允许放置在该类型的方法/类/属性等上的任何属性。该类必须继承自System.Attribute或其他继承自该类的类。

VB示例,在C#中应该非常相似。由于属性target属性,这个只能放在方法上。不要在任何地方使用属性的AttributeUsage属性。

<AttributeUsage(AttributeTargets.Method)>
Public Class OperatorFriendlyDescription
    Inherits System.Attribute

  Public Property Description As String

  Public Sub New(description As String)
    Me.Description = description
  End Sub

End Class

答案 1 :(得分:2)

没有神奇的方法可以使用OperatorFriendlyDescription属性而不定义它,但如果它不需要过滤器功能,则不要继承FilterAttribute

如果你看一下MVC FilterAttribute的声明,你会发现它只是一个专门的System.Attribute

public abstract class FilterAttribute : Attribute, IMvcFilter

MSDN documentation我们可以验证System.Attribute是所有属性的基础。 由于您不需要特殊功能,因此请继承该功能。

C#中的示例属性

public class ArbitraryAttribute: Attribute
{
    public string ArbitraryData { get; private set; }
    public ArbitraryAttribute(string arbitraryData)
    {
        ArbitraryData = arbitraryData;
    }
}