2009-12-07 8 views
7

मैं यह जानने की कोशिश कर रहा हूं कि उपयोगकर्ताओं के लिए उनकी भूमिकाओं के आधार पर लिंक कैसे दिखाएं/छुपाएं। मुझे पता है कि एक एक्शन विधि के लिए प्राधिकरण विशेषता कैसे सेट करें, लेकिन अगर उपयोगकर्ता कहता है, मेरे व्यवस्थापक डेटाबेस में कोई व्यवस्थापक या प्रबंधक है तो मुझे लिंक को दृश्य में छुपाएं बनाने में परेशानी हो रही है।एएसपी.NET एमवीसी व्यू में लिंक दिखा रहा है/छुपाएं

किसी भी अच्छा लेख या कोड उदाहरण किसी की ओर मुझे इंगित कर सकते हैं?

उत्तर

11

अपने विचार में आप उपयोगकर्ता को System.Web.Mvc.ViewPage के User संपत्ति के माध्यम से संदर्भित कर सकते हैं।

उदा।

+0

धन्यवाद एक फिल्टर इस्तेमाल कर सकते हैं! यहां एक मोड़ है - मेरे पास मास्टर पेज में मेरे टैब लिंक हैं और मैं कुछ भूमिकाओं के लिए एक टैब दिखाना चाहता हूं। क्या आप जानते हैं कि मैं अपने मास्टर के लिए आईप्रिनिपियर के लिए संदर्भ कैसे जोड़ सकता हूं? – Ben

+2

उपयोग या तो 'HttpContext.Current.user' या' ViewContext.HttpContext.User' - कि :-) – Charlino

+0

आह चाल करना चाहिए, अब मैं पर चीजों के साथ स्थानांतरित कर सकते हैं ... मैं सहायता की सराहना करते – Ben

2

यह एक बात मैं सच में MVC के साथ पसंद नहीं (ASP.Net MVC, नहीं पैटर्न के रूप में) है है एक

<% if (User.IsInRole("Admin")) { %> 
    <%= Html.ActionLink("Admin only link", "Edit", "Users") %> 
<% } %> 

<% if (User.IsInRole("Manager") || User.IsInRole("Admin")) { %> 
    <%= Html.ActionLink("Manager & Admin only link", "Edit", "Product") %> 
<% } %> 

HTHs,
चार्ल्स: आपके विचार में आप की तरह कुछ हो सकता है मार्कअप में यूआई तर्क को स्थानांतरित करने की प्रवृत्ति।

कि तर्क aspx में एक बार अपने पर यूनिट परीक्षण चलाने के लिए कोई तरीका नहीं है।

Personly मुझे लगता है कि एक उपयुक्त यूआई पैटर्न (MVC या एमवीपी आदि) के साथ webforms पेज सशर्त तर्क यह है कि परीक्षण किया जा नहीं कर सकते से अटे पड़े होने से सूट बेहतर होगा।

+1

जैसा कि मैं अभी भी खुद को एक नौसिखिया मानता हूं, मैं बेहतर और बेहतर हो रहा हूं और मैं जो कह रहा हूं उससे पूरी तरह सहमत हूं और अपने मार्कअप पृष्ठों से बिल्ली को दूर कर दिया है। मैं अपने फ्रीलांस प्रोजेक्ट्स पर अपने दिन की नौकरी और एमवीसी में वेबफॉर्म में काम करता हूं और एक ही समय में सीखने के साथ कई विरोधाभासी सिरदर्द करता हूं। हालांकि मैंने इकाई परीक्षण के बारे में बहुत कुछ नहीं सीखा है - मुझे इसमें कोई संदेह नहीं होगा कि निकट भविष्य में मुझे एक दिन की आवश्यकता होगी; और मैं उम्मीद कर रहा हूं कि एमवीसी टीम ने इसे संबोधित किया होगा। टिप्पणी के लिए धन्यवाद +1 -बेन – Ben

+2

यूआई परीक्षण के लिए सेलेनियम का उपयोग करें। आप अलग-अलग भूमिकाओं का उपयोग करके परीक्षण चला सकते हैं और फिर HTML नियंत्रण के अस्तित्व के लिए परीक्षण कर सकते हैं (हे rhymes)। – Bob

1
<% if(HttpContext.Current.User.IsInRole("Admin")){%> <a href="/Admin">Admin</a> <% } %> 

इस कोड का उपयोग करें। यह आसान है।

0

मैं भूमिका सत्यापन के लिए और cshtml मैं इस वर्ग के लिए प्रयोग किया जाता में एक स्थिर वर्ग का उपयोग करें, भूमिका सत्यापन cshtml बाहर है।

मुझे अपने प्राधिकृत कार्यों या सामग्री डेटाबेस में (उपयोगकर्ता भूमिका द्वारा या द्वारा) है, ताकि आप न पहुँच परिभाषा परिवर्तन करता है, तो पुनर्वितरित करने के लिए है।

public static class AuthorizeContent 
{ 
    public static bool AuthorizeAccessContent(string Content) 
    { 
     bool bReturn = false; 
     DBContext db = new DBContext(); 
     string[] RolesUser = Roles.GetRolesForUser(WebSecurity.CurrentUserName); 

     foreach (AuthorizedContentRole aut in db.AuthorizedContentRole) 
     { 
      foreach (string rol in RolesUser) 
      { 
       if (aut.Role==rol && aut.Content==Content) 
       { 
        bReturn = true; 
        break; 
       } 
      } 
     } 
     foreach (AuthorizedContentUser aut in db.AuthorizedContentUser) 
     { 
      if (aut.UserName == WebSecurity.CurrentUserName && aut.Content == Content) 
      { 
       bReturn = true; 
       break; 
      } 
     } 

     return bReturn; 
    } 

/// cshtml

@if (AuthorizeContent.AuthorizeAccessContent(Content)) 
{ 

    <li class="two"> 
     <h5>Administrator link</h5> 
     @Html.ActionLink("Admin secret info","Index", "Information") 
    </li> 
} 

में आप भी तरह [AccionAuthorize (कार्रवाई = "MyContent")]

public class AccionAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string Action { get; set; } 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
      filterContext.Result = new HttpUnauthorizedResult(); 
     else if (!AutorizacionContenido.AutorizaAccesoContenido(Action)) 
      filterContext.Result = new HttpUnauthorizedResult(); 
     base.OnAuthorization(filterContext); 
    } 
}