2011-02-23 12 views
5

के डुप्लिकेशन से बचने के लिए कैसे मैंने System.Web.Mvc.AuthorizeAttribute से व्युत्पन्न एक कस्टम प्राधिकरण विशेषता लिखी है। मैं कुछ विशेषताओं तक पहुंच प्रतिबंधित करने के लिए इसे अपने नियंत्रकों से सफलतापूर्वक उपयोग कर रहा हूं।प्राधिकरण कोड तर्क

public class ArticleController : Controller 
{ 
    [CustomAuthorize(Role.Administrator)] 
    public ActionResult Delete(int id) 
    { 
     // ... 
    } 
} 

और यह ठीक काम करता है। अब मैं एक ही प्राधिकरण तर्क के अनुसार HTML तत्वों को दिखाना या छिपाना चाहता हूं। उदाहरण के लिए, मेरे आलेख "आलेख" में, यदि उपयोगकर्ता व्यवस्थापक नहीं है तो मैं कार्रवाई बटन "हटाएं" को छिपाना चाहता हूं। मैं ऐसा ही कुछ लिखा है:

<ul id="menu"> 
    <li>@if (User.IsInRole(Role.Administrator)) { 
      @Html.ActionLink("Delete", "Delete", "Article", new { id = article.ID }, null) 
     } </li> 
</ul> 

यह ठीक के रूप में अच्छी तरह से काम है, लेकिन यह कोड तर्क दोहराव पैदा करता है क्योंकि मैं कोई कार्रवाई करने के दो बार आवश्यक credientials निर्दिष्ट करना होगा: नियंत्रक में

  • कार्रवाई को ब्लॉक या अनुमति देने के लिए।
  • एक्शन लिंक दिखाने या छिपाने के लिए दृश्य में।

इस डुप्लिकेशन से बचने का सबसे अच्छा तरीका क्या है? क्या विचारों से मेरी कस्टम प्राधिकरण विशेषता का पुन: उपयोग करने का कोई तरीका है?

उत्तर

3

एक कस्टम सहायक सबसे अच्छा विकल्प, की तरह कुछ किया जाना चाहिए।

1

मैं इसके लिए कस्टम HTML सहायक बनाउंगा।

public MvcHtmlString AuthorizedActionLink(this HtmlHelper htmlHelper, 
string actionName, ... , Role role) 

और अगर आपको लगता है कि भूमिका पैरामीटर बेमानी है, तो आप प्रतिबिंब का उपयोग कर नियंत्रक कार्रवाई का निरीक्षण किया और अनुमति भूमिकाओं स्वचालित रूप से निर्धारित कर सकते हैं।

@Html.SecureActionLink("Delete", "Delete", "Article") 

यह सहायक सेवा के कुछ प्रकार पर जांच होगी यदि वर्तमान उपयोगकर्ता/भूमिका इस लिंक पर अनुमति है को देखने के लिए:

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