2016-04-14 4 views
7

मेरे पास GetRole() नाम से एक स्थिर विधि है जो एक स्ट्रिंग मान देता है।
अब मैं विशेषता पैरामीटर का उपयोग करने के लिए इसे कॉल करना चाहता हूं।
उदाहरण के लिए:विशेषता पैरामीटर का उपयोग करने में विधि को कैसे कॉल करें

[Authorize(Roles = GetRole())] 
public ActionResult Get() 
{ 
} 

public static string GetRole() 
{ 
    return "Admin"; 
} 

लेकिन संकलक त्रुटि नीचे मिल:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

कृपया मेरी मदद करो विशेषताओं में एक विधि कॉल करने के।

+0

आप नहीं कर सकते। केवल पैरामीटर मान जिन्हें संकलन-समय पर हल किया जा सकता है, स्वीकार किए जाते हैं। –

+1

गुण कोड के रूप में संग्रहीत नहीं हैं, वे मेटाडेटा के रूप में संग्रहीत हैं - यही कारण है कि आप केवल उनके अंदर संरचनाओं की सीमित सीमा का उपयोग कर सकते हैं। –

उत्तर

5

संकलक त्रुटि बहुत स्पष्ट है, जब एक विशेषता की घोषणा (क्योंकि अपने मूल्य संकलन समय पर पता होना चाहिए) आप किसी भी विधि कॉल नहीं कर सकते, लेकिन आप प्राप्त कर सकते हैं अपने स्वयं के कस्टम विशेषता, AuthorizeAttribute से प्राप्त सभी प्रदर्शन करने के लिए आपको जरूरी तर्क क्या हम सभी ने NameAttribute & फ़ैंसी लंबे समय से प्रतीक्षा किए गए स्थानीयकरण-जागरूक डेटा एनोटेशन से पहले दोस्तों को स्थानीयकृत करने के लिए क्या किया है? अवधारणा के

सबूत:

class DynamicAuthorizeAttribute : AuthorizeAttribute { 
    protected bool AuthorizeCore(HttpContextBase context) { 
     // Perform your logic here, eventually update Roles property 
    } 
} 

और फिर:

[DynamicAuthorize] 
public ActionResult Get() { 
    // ... 
} 

यह सिर्फ एक संभव तरीका है, वहाँ आप अपने खुद के तर्क डाल या बस Roles संपत्ति को अद्यतन करने और हमेशा की तरह प्रतिनिधि कर सकते हैं तर्क base.AuthorizeCore(context) पर कॉल कर रहा है। ध्यान रखें कि यहां आपका सभी कोड थ्रेड-सुरक्षित होना चाहिए।

आप स्थिर तरीकों के साथ काम कर रहे हैं और आप अपने नियंत्रक के अंदर उस तर्क रखने के लिए तो आप (उदाहरण के लिए) स्वीकार करने के लिए चारों ओर खेल सकते हैं कुछ इस तरह हैं:

[DynamicAuthorize(typeof(MyView), nameof(GetRole))] 

ध्यान दें कि आप नियंत्रक का उपयोग कर सकते और context.HttpContext.Request.RequestContext.RouteData से नाम देखें।

फिर ऐसी स्थिर विधि का आह्वान करें। ध्यान दें कि यदि तर्क वास्तव में जटिल है और बहुत भिन्न होता है तो आप इस तर्क को केंद्रीकृत करना चाहते हैं और ऐसा करने के लिए अन्य एमवीसी उपकरण का उपयोग कर सकते हैं।

1

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.

यह एक तथ्य है। चारों ओर कोई रास्ता नहीं है, एक विशेषता तर्क समय स्थिर संकलन होना चाहिए। आप एक विधि नहीं बुला सकते हैं।

आप है परिभाषित किया जाता है कर सकते हैं क्या एक निरंतर:

public class MyClass 
{ 
    public const string Role = "Admin"; 
    [Authorize(Roles = Role)] 
    public ActionResult Get() 
    { 
    }  
} 

स्थिरांक हैं (जैसा कि नाम से पता चलता) समय संकलन निरंतर है, तो आप शायद इस समाधान में मदद करता है।

आप रन-टाइम पर एक मूल्य निर्धारित करने के लिए चाहते हैं, इस के रूप में विशेषताओं संकलन समय पर आवंटित कर रहे हैं काम नहीं करेगा।

+0

उस डाउनवोट के लिए क्या था? शायद क्योंकि मैं 'प्राधिकरण' विशेषता नहीं जानता। लेकिन सवाल ने कभी नहीं कहा कि यह एक विशिष्ट कार्यान्वयन के साथ एक विशिष्ट विशेषता के बारे में है। यह भी नहीं पता कि 'AuthorizeCore' (जैसा कि एड्रियानो रिपेटी द्वारा उल्लिखित) कहा जाता है। –

+0

मैं आपके लिए वोट देता हूं। मुझे नहीं पता। –

0

मैंने लॉग इन उपयोगकर्ता को अधिकृत करने के लिए अपनी स्वयं की विधि का उपयोग किया।

इसे देखो, शायद यह आपकी मदद करेगा।

public static bool GetRole(string Codename) 
    {    
     if (LogInUser == null) 
     { 
      return false; 
     } 

     return true; 
    } 

और उपयोगकर्ता पहुँच गया है या नहीं की जांच करने के

if (!Utility.GetRole("Admin")) 
      return View("AccessDenied"); 

मैं भी प्राधिकरण में बनाया मानक के लिए कोड है,

यदि आपको आवश्यकता, बस नीचे टिप्पणी।

0

आप इस तरह कर सकते हैं,

यहाँ क्योंकि आप एक भूमिका के बजाय प्रमाणित होने की भूमिकाओं की सूची पारित कर सकते हैं, इस विधि बेहतर है,।

(कम से नीचे देखो, मैं व्यवस्थापक और दोनों मास्टर पारित कर दिया)
[Authorization(Roles = "admin,master")] 
public class MyController : Controller 
{ 
    //Your remaining code. 
} 

और इसे अधिकृत करने के लिए, मेरे पास ये तरीका है।

public class Authorization : AuthorizeAttribute 
{ 

public string Roles { get; set; } 

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    if (User != null) 
    { 
     if (String.IsNullOrEmpty(Roles)) 
     { 
      return true; 
     } 

     string[] split = Roles.Split(','); 

     foreach (UserRole item in User) 
     { 
      if (split.Contains(item.Role.CodeName)) 
      { 
       return true; 
      } 
     } 
     return false; 

    } 
    else 
     return false; 
} 

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    filterContext.Result = new HttpUnauthorizedResult(); 
} 
} 
+0

हम्मम्म, मेरा डाउनवोट क्योंकि यह मौजूदा उत्तरों के लिए कुछ भी नहीं जोड़ता है और मौजूदा AuthorizeAttribute (जो पहले से ही कई भूमिकाओं को संभालता है ...) के लिए कुछ भी नहीं जोड़ता है, जबकि अभी भी सवाल का जवाब नहीं दे रहा है (एक विधि का आह्वान ...)। कम से कम आपके अन्य उत्तर ने एक वैकल्पिक दृष्टिकोण (घोषणात्मक प्राधिकरण के बजाय अनिवार्य) लिया –

+0

हाँ @ एड्रियनो रिपेटी, शायद ऐसा इसलिए है क्योंकि हम दोनों कुछ समय जवाब दे रहे हैं..और मुझे नहीं पता कि आपने एक ही अवधारणा के साथ जवाब दिया है .. – Bharat

संबंधित मुद्दे