2010-04-27 8 views
5

मेरे पास आइटम की एक सूची प्रदर्शित करने के लिए एक दृश्य है। उपयोगकर्ता नए आइटम को संपादित, हटा या बना सकता है, लेकिन उनके प्राधिकरणों के अनुसार वे इन कार्यों में से कुछ करने की अनुमति दे सकते हैं या नहीं।एमवीसी में प्राधिकरण तर्क से मुक्त विचार कैसे रखें?

मैं केवल कार्रवाई से है जो वर्तमान उपयोगकर्ता करने के लिए अनुमति दी है प्रदर्शित करने के लिए आवश्यकता है, लेकिन मैं प्राधिकरण के साथ विचारों को अस्त-व्यस्त करने के लिए नहीं चाहते हैं तो-और की

एक बहुत ही आम आवश्यकता होने का घृणा, मैं इसे करने का असली संतोषजनक तरीका नहीं मिल रहा है।

मेरा सबसे अच्छा दृष्टिकोण अब तक Html.ActionLink विस्तार विधि को अधिभार प्रदान करना है जो पूछने की अनुमति लेता है, लेकिन अधिक जटिल परिदृश्य होने जा रहे हैं, जैसे HTML के पूरे ब्लॉक छिपाने या लेबल के लिए टेक्स्टबॉक्स स्विच करना + छिपा हुआ।

क्या ऐसा करने का कोई बेहतर तरीका है?

उत्तर

2

एक उदाहरण मैं सोच सकता हूं कि एचटीएमएल। रेंडरएक्शन (लिंक: http://msdn.microsoft.com/en-us/library/ee703490.aspx) का आह्वान करना होगा, और तब उस लिंक को पास करें जिसे आप एक्शन विधि के लिए रूट मान के रूप में उपयोग करना चाहते हैं (यह आपके कार्यवाही पर पैरामीटर के रूप में दिखाई देगा)। चूंकि यह एक रेंडरएक्शन है, इसलिए आप नियंत्रक प्रक्रिया के माध्यम से वापस जाना चाहते हैं और इस प्रकार आप उपयोगकर्ता के राज्य के आधार पर जो भी दृश्य या डेटा चाहते हैं उसे प्रस्तुत कर सकते हैं।

उदाहरण:

<% Html.RenderAction("Permissions" /* Controller */, "PermissionLink", new { Url = "Admin.aspx" }); %> 

और अपने नियंत्रक की तरह कुछ होगा:

public ActionResult PermissionsLink (string url) 
{ 
    // Do Whatever kind of Authentication you want here, Session is available, etc 

    if(authenticated) 
     return View("Link"); 
    else 
     return View("Blank"); 
} 
+0

क्रिस्ग ने अपने उत्तर पर क्या प्रस्तावित करने का यह एक बेहतर तरीका है, लेकिन यह अभी भी घटक स्तर पर है (क्रिज़ दृश्य स्तर पर था)। हो सकता है कि मैं "रोएक्शन" घटक करने के लिए पर्याप्त पागल न हो और प्रत्येक पंक्ति को उस क्रिया को प्रस्तुत करने के लिए कहूं जो उपयोगकर्ता करने में सक्षम है, लेकिन यह संभव है कि मैं आखिरकार आइटम पर कार्य करने के लिए केवल एक टूलबार के साथ एक चेकबॉक्स दृष्टिकोण लागू करता हूं । मुझे थोड़ी देर लग गई, लेकिन मुझे मिल गया। Tnks। –

0

हमारे पास यही समस्या थी। हमने बहुत सारे सहायक तरीकों को लिखना समाप्त कर दिया और ऐसे मामलों में जहां बहुत सारे एचटीएमएल आउटपुट की आवश्यकता थी, हमने उन्हें आंशिक विचारों में रखा।

0

यह नहीं कौन-से मान उपयोगकर्ता को बदल सकते हैं के आधार पर विभिन्न नियंत्रण के साथ कई दृश्य बनाने के लिए है, तो सरल होगा उपयोगकर्ता के पहुंच अधिकारों के आधार पर सही दृश्य वापस करें?

विचार केवल जानकारी प्रस्तुत करने के लिए होना चाहिए, वास्तव में उनमें कोई भी सशर्त तर्क नहीं होना चाहिए, या कम से कम एक न्यूनतम।

मुझे हमेशा पता चला है कि जब मैं उस बिंदु पर पहुंच जाता हूं जहां मुझे आपकी तरह की स्थिति को गड़बड़ाना मुश्किल लगता है, तो सबसे अच्छा समाधान हमेशा नियंत्रक पर वापस जाना है और मैं आकलन कर रहा हूं कि मैं क्या कर रहा हूं पहली जगह में दृश्य।

जब तक व्यू को अपना काम करने के लिए बुलाया जाता है, तब तक सभी महत्वपूर्ण 'निर्णय' पहले से ही किए जाने चाहिए।

+2

मैं समझता हूं कि आप क्या कहते हैं, लेकिन हर निर्णय के लिए एक दृष्टिकोण रखने के लिए व्यावहारिक नहीं है। ऊपर दिए गए मेरे उदाहरण में 7 विचार होंगे (प्रत्येक संयोजन के लिए एक)। अब एक उच्च स्तर के विस्तार के लिए बहुत से एक्सेस-प्रतिबंधित सुविधाओं के साथ एक व्यापार ऐप के बारे में सोचें। कभी-कभी संरचना सबसे अच्छा तरीका है, लेकिन तब भी, घटक स्तर पर निर्णय लेने के लिए बाएं हैं। –

+0

ऐसा करने में मैंने अपनी प्रक्रियाशक्ति कार्रवाई के लिए 34 विचारों की गणना की। यह अच्छा दृष्टिकोण नहीं है। :/ – dariol

0

जटिल स्थितियों में, जहां कई की स्थिति और नियम मैं इस तरह कर रहा हूँ कर रहे हैं में:

ViewModel

public class ModelView 
{ 
    private IAuthorisationService { get; set; } 

    public bool CanShow 
    { 
     ... 
    } 
} 

दृश्य:

<% if(Model.CanShow) { %> 
    <html> 
<% } %> 
+0

यही वह है जो मैं नहीं करना चाहता: प्राधिकरण के लिए दृश्य पर बयान दें। यह ViewMessage या कुछ पर अनुमतियों को लोड करने से पहले भी बेहतर है और फिर इसे पूछताछ करता है। –

0

मैं व्यक्तिगत रूप से कुछ भी गलत नहीं दिखाई देता है दृश्य के भीतर इस तरह के सशर्त तर्क के साथ। तर्क अभी भी प्रस्तुति के बारे में सब कुछ है। आप तय करते हैं कि दिखाना या छिपाना, सक्षम करना या अक्षम करना, हाइलाइट करना आदि। यह दृश्य का काम है, नियंत्रक नहीं। जब तक दृश्य को वास्तव में अपने फैसले पर आने के लिए कुछ भी गणना करने की आवश्यकता नहीं होती है।नियंत्रक दृश्य के कार्यान्वयन के अज्ञात होना चाहिए जितना अन्य तरीकों से।

मेरे दृष्टिकोण यह होगा:

  • नियंत्रक उपयोगकर्ता है कि एक्सेस का वह स्तर तय करने की वास्तविक तर्क करना सुनिश्चित
  • (ViewModel के माध्यम से यानी) का उपयोग कर देखने के लिए इस जानकारी दर्रा लेकिन एक तरह से कार्यान्वयन विवरण (यानी "उपयोगकर्ता व्यवस्थापक है", "उपयोगकर्ता एक लेखक है", आदि)
  • दृश्य को केवल नियंत्रक द्वारा प्रदान किए गए पूर्व-संकलित डेटा का उपयोग करके उचित रूप से आकर्षित करने दें।

यह भी लाभ है कि दृश्य को हटाया जा सकता है और नियंत्रक पर किसी भी प्रभाव के बिना प्रतिस्थापित किया जा सकता है।