asp.net mvc пользовательские атрибуты - PullRequest
0 голосов
/ 23 марта 2011

Я пытаюсь создать пользовательский атрибут в mvc, чтобы использовать его параметры в представлении как breadCrumb.

хорошо, это код атрибута

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class BreadCrumbAttribute : Attribute {

    public BreadCrumbAttribute(string title, string parent, string url) {
        this._title = title;
        this._parent = parent;
        this._url = url;
    }

    #region named parameters properties
    private string _title;
    public string Title {
        get { return _title; }
    }

    private string _url;
    public string Url {
        get { return _url; }
    }

    private string _parent;
    public string Parent {
        get { return _parent; }
    }
    #endregion

    #region positional parameters properties
    public string Comments { get; set; }
    #endregion

}

этовызов атрибута

[BreadCrumbAttribute("tile", "parent name", "url")]
    public ActionResult Index() {
     //code goes here
     }

это способ, которым я хотел бы получить значения.(это частичное представление)

System.Reflection.MemberInfo inf = typeof(ProductsController);
object[] attributes;
attributes = inf.GetCustomAttributes(typeof(BreadCrumbAttribute), false);

foreach (Object attribute in attributes) {
    var bca = (BreadCrumbAttribute)attribute;
    Response.Write(string.Format("{0}><a href={1}>{2}</a>", bca.Parent, bca.Url, bca.Title));
}    

К сожалению, атрибут не получил вызова при том способе, которым я его реализую.Хотя, если я добавлю атрибут в Class вместо метода Action, это сработало.Как я мог заставить это работать?

Спасибо

1 Ответ

2 голосов
/ 23 марта 2011

Проблема в том, что вы используете отражение, чтобы получить атрибуты для класса, поэтому, естественно, он не включает атрибуты, определенные в методе действия.

Чтобы получить их, вы должны определить ActionFilterAttribute, а в методе OnActionExecuting или OnActionExecuted вы можете использовать метод filterContext.ActionDescriptor.GetCustomAttributes() ( описание MSDN здесь ).

Обратите внимание, что с этим решением у вас, вероятно, будут два разных типа атрибутов: первый - это тот, который вы написали, для определения хлебных крошек. Второй - это тот, который просматривает атрибуты выполняемого действия и создает крошку (и, по-видимому, добавляет ее в ViewModel или вставляет ее в HttpContext.Items или что-то в этом роде).

...