2016-09-29 3 views
3

Моя цель - создать настраиваемый атрибут, такой как System.ComponentModel.DataAnnotations.Display, который позволяет мне передать параметр.Передача пользовательского параметра в пользовательский атрибут - ASP.NET MVC

Пример .: В System.ComponentModel.DataAnnotations.Display я могу передать значение параметра Name

[Display(Name = "PropertyName")] 
public int Property { get; set; } 

Я хочу сделать то же самое, но в контроллерах и действий, как ниже

[CustomDisplay(Name = "Controller name")] 
public class HomeController : Controller 

, а затем введите элемент ViewBag или ViewData с его значением.

Может кто-нибудь помочь мне с этим?

Спасибо.

+1

Вы должны отражать в типе Controller, используя ['GetCustomAttributes'] (https://msdn.microsoft.com/en-us/library/dwc6ew1d.aspx), используйте' ViewContext.Controller' Refer [this] (http://stackoverflow.com /вопрос s/19412483/mvc3-can-you-give-controller-a-display-name) –

+0

Пользовательские атрибуты не позволяют хранить данные в ViewBag или ViewData –

+1

См. [этот ответ] (http://stackoverflow.com/questions/2656189/how -do-i-read-an-attribute-on-a-class-at-runtime), а затем назначить результат «ViewBag» –

ответ

4

Это очень просто

public class ControllerDisplayNameAttribute : ActionFilterAttribute 
{ 
    public string Name { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string name = Name; 
     if (string.IsNullOrEmpty(name)) 
      name = filterContext.Controller.GetType().Name; 

     filterContext.Controller.ViewData["ControllerDisplayName"] = Name; 
     base.OnActionExecuting(filterContext); 
    } 
} 

Затем вы можете использовать его в контроллере, как показано ниже

[ControllerDisplayName(Name ="My Account Contolller"]) 
public class AccountController : Controller 
{ 
} 

А на ваш взгляд, вы можете использовать его автоматически с @ViewData["ControllerDisplayName"]

+0

Спасибо большое @Haitham. Несколько минут назад я начал работать, используя OnActionExecuting моего BaseController. Мое исправление более сложное, чем ваш путь, поэтому я изменяю его, чтобы работать как ваш ответ. Это более элегантно. –

Смежные вопросы