2016-09-29 2 views
3

Mein Ziel ist es, ein benutzerdefiniertes Attribut wie System.ComponentModel.DataAnnotations.Display zu erstellen, mit dem ich einen Parameter übergeben kann.Übergeben benutzerdefinierter Parameter in benutzerdefiniertes Attribut - ASP.NET MVC

Bsp .: In System.ComponentModel.DataAnnotations.Display ich Wert auf den Parameternamen passieren kann

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

ich das gleiche tun wollen, aber in Controller und Aktionen wie unter

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

und füllen Sie dann ein ViewBag- oder ViewData-Objekt mit seinem Wert.

Kann mir jemand dabei helfen?

Danke.

+1

Sie haben zu reflektieren Verwenden Sie auf dem Controller-Typ mit "GetCustomAttributes" (https://msdn.microsoft.com/en-us/library/dwc6ew1d.aspx) "ViewContext.Controller". Verweisen [this] (http://stackoverflow.com /Frage s/19412483/mvc3-can-you-give-controller-a-display-name) –

+0

CustomAttributes erlauben keine Geschäftsdaten in ViewBag oder ViewData –

+1

Siehe [diese Antwort] (http://stackoverflow.com/questions/2656189/how -do-ich-las-ein-Attribut-auf-einer-Klasse-zur-Laufzeit) und dann das Ergebnis zu 'ViewBag' –

Antwort

4

Dies ist sehr einfach

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); 
    } 
} 

Dann Sie es in Ihrem Controller wie unten

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

Und in Ihrer Ansicht verwenden, können Sie es automatisch verwenden können mit @ViewData["ControllerDisplayName"]

+0

Vielen Dank @Haitham. Vor ein paar Minuten habe ich es mit OnActionExecuting meines BaseController funktioniert. Meine Behebung ist komplexer als deine Art, also modifiziere ich sie so, dass sie als deine Antwort funktioniert. Es ist eleganter. –

Verwandte Themen