2011-12-03 17 views
8

में मैजिक स्ट्रिंग्स मेरे पास डेस्कटॉप सॉफ्टवेयर विकास में पृष्ठभूमि है और मैं एएसपी.नेट एमवीसी सीखने के साथ शुरुआत कर रहा हूं।एएसपी.नेट एमवीसी

if (!Request.IsAuthenticated) 
    return RedirectToAction("Login", "Account"); 

दूसरे शब्दों में, उपयोगकर्ता के लिए "/ खाता/के लिए लॉग इन" अनुप्रेषित:

मेरा डिफ़ॉल्ट HomeController में मैं सूचकांक कार्रवाई जो कोड है कि इस तरह दिखता है है है। खाता नियंत्रक। लॉगिन कार्रवाई तब उपयोगकर्ता को संभाल लेगी और उसे सफलतापूर्वक लॉग इन करने के बाद उसे होमकंट्रोलर पर वापस भेज देगा।

यह कोड मुझे गंध करता है, शायद इसलिए कि मैं डेस्कटॉप सॉफ़्टवेयर में चीजों को अलग-अलग करने का आदी हूं। अगर मैं लॉगिन क्रिया का नाम "लॉगऑन" में बदलूं तो क्या होगा? क्या होगा अगर मैं खाता नियंत्रक को पूरी तरह से हटा दूं और इसे किसी और चीज़ से बदल दूं? मैं एक नई बग पेश करूंगा लेकिन मुझे कंपाइलर त्रुटियां नहीं मिलेंगी, और मेरे यूनिट परीक्षण शायद इसे पकड़ नहीं पाएंगे। चूंकि मैंने नियंत्रक और क्रिया नाम निर्दिष्ट करने के लिए स्ट्रिंग का उपयोग किया है, इसलिए रीफैक्टरिंग और रीडिज़ाइनिंग में पूरे स्थान पर कोड तोड़ने की अधिक क्षमता है।

मैं चाहते हैं क्या कुछ इस तरह है:

if (!Request.IsAuthenticated) 
    return RedirectToAction(() => AccountController.Login); 

हालांकि मुझे यकीन है कि अगर यह है कि संभव है नहीं कर रहा हूँ या अगर यह यह करने के लिए सबसे अच्छा तरीका है।

क्या मैं बेवकूफ हूं, या अन्य लोगों को भी यही समस्या है? इसके आसपास पाने के लिए आप क्या करते हैं?

उत्तर

20

मुझे लगता है कि आप देख रहे हैं कारण है कि T4MVC मौजूद है - यह "जादू तार" नियंत्रकों और कार्यों से संबंधित के सभी दूर करता है और उन्हें वर्गों और गुणों के साथ बदल देता है।

T4MVC साथ

, इस

if (!Request.IsAuthenticated) 
    return RedirectToAction("Login", "Account"); 

हो जाता है इस

if (!Request.IsAuthenticated) 
    return RedirectToAction(MVC.Account.Login()); 

वहाँ एक ध्वज है कि प्रत्येक निर्माण पर टेम्पलेट चलाने के लिए यह मजबूर करने के लिए T4MVC सेटिंग्स में सेट किया जा सकता है, तो आप जल्दी दे रही है चेतावनी जब कुछ बदल गया हो सकता है।

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

इस

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     if (!Request.IsAuthenticated) 
      return RedirectToAction("Login", "Account"); 

     // .... carry on 
    } 
} 

public class HomeController : Controller 
{ 
    [Authorize] 
    public ActionResult Index() 
    { 
     // .... carry on 
    } 
} 
तो web.config में

हो जाता है, खाते में प्रवेश यूआरएल

<authentication mode="Forms"> 
    <forms loginUrl="account/login" timeout="30" /> 
</authentication> 

दी पर बात करने के लिए url सेट, यह आप किसी भी नहीं देता है सुरक्षा अगर आपके नियंत्रक और कार्य बदलते हैं (आपकी मूल शिकायत के समान), लेकिन आप हमेशा के लिए कर सकते हैं चयनित यूआरएल को सही नियंत्रक और कार्रवाई में निर्देशित करने के लिए एक मार्ग स्थापित किया है और मार्ग में टी 4 एमवीसी जेनरेटेड कक्षाओं का उपयोग करें, जो चीजों को बदलते समय आपको कुछ संकलन समय चेतावनी प्रदान करते हैं।

+1

वाह कि इतने उपयोगी है। मैं चाहता हूं/आशा करता हूं कि वे भविष्य में इसे सीधे एमवीसी में एकीकृत करें। मैं नहीं देखता कि इन दिनों इतने सारे जादू तारों का उपयोग कैसे किया जा सकता है। – DLeh

3

मुझे पता है कि यह वास्तव में एक जवाब नहीं है, लेकिन Resharper जैसे टूल का उपयोग करके आप इसे हल करने में भी मदद कर सकते हैं।Resharper नियंत्रकों और कार्यों का ट्रैक रखता है और एक चेतावनी जारी करता है अगर कुछ जादू स्ट्रिंग जो नियंत्रक होने वाला है, वह एक नहीं है। यह केवल मानक तरीकों जैसे कि RedirectToAction या ActionLink पर काम करता है।

संपादित करें: जाहिर है आप इसे अपने कस्टम एक्सटेंशन विधियों के साथ काम करने के लिए एनोटेशन जोड़ सकते हैं। here देखें।

1

रस का जवाब हालांकि यह वास्तव में आपकी शंकाओं का समाधान नहीं करता है पैसे पर सही है, .. जो वास्तव में है "क्यों वहाँ MVC में जादू तार कर रहे हैं?"।

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

मुझे याद करने के लिए यह तरीका MVC मिलान सम्मेलनों के लिए एक से अधिक क्षेत्रों खोज के साथ कुछ हो सकता था लगता है, और यह बहुत टाइप किया वस्तुओं की तुलना तार के साथ प्राप्त करने के लिए आसान था। यह विशेष रूप से दृश्यों और आंशिकों के बारे में सच है। ।

हो सकता है कि किसी को उस विवरण को याद रखता है

0

में झंकार कर सकते T4MVC के लिए एक विकल्प के रूप में, मैं एक छोटे से सहायक कि आप उतना वास्तव में आपके द्वारा सुझाए गए वाक्य रचना और स्वचालित रूप से उत्पन्न कोड की आवश्यकता के बिना उपयोग करने के लिए अनुमति देता है लिखा है:

<a href="@(Url.To<MyController>().MyAction("foo", 42))">link</a> 

और नियंत्रक में:

return Redirect(Url.To<MyController>().MyAction("foo", 42).ToString()); 

मेरे समाधान क्रम क्या T4MVC निर्माण समय में करता है पर ऐसा करने से काम करता है।

एक NuGet package और एक GitHub project नहीं है।

4

आप जादू तारों से बचने में आपकी सहायता के लिए अपने स्वयं के कस्टम एक्सटेंशन विधियां लिख सकते हैं। उदाहरण के लिए आप मेरी कार्यान्वयन यहाँ देख सकते हैं: https://github.com/ivaylokenov/ASP.NET-MVC-Lambda-Expression-Helpers ध्यान रखें कि यह प्रदर्शन भूमि के ऊपर का एक छोटा सा रन-टाइम जो आप सभी लिंक कैशिंग द्वारा हल कर सकते हैं कहते हैं। यदि आप संकलन समय जांचना चाहते हैं तो टी 4 एमवीसी आपका समाधान है: http://t4mvc.codeplex.com/

3

सी # 6 में आप nameof का लाभ उठा सकते हैं और आसानी से इन जादू तारों में से कई को पुनः प्रतिक्रिया दे सकते हैं।

... = new SelectList(context.Set<User>(), nameof(User.UserId), nameof(User.UserName)); 

... 
return RedirectToAction(nameof(Index)); 
0

आप वास्तव में केवल कार्यों और नियंत्रकों के लिए पुनः निर्देशित, सी # 6 nameof ऑपरेटर वास्तव में उपयोगी है के बारे में चिंतित हैं, तो - जब तक आप नियंत्रकों के बीच रीडायरेक्ट करना होगा। मैं एक उपयोगिता विधि लेखन नियंत्रक नाम पाने के लिए समाप्त हो गया:

public class Utilities 
{ 
    public static string ControllerName<T>() where T : Controller 
    { 
     var name = typeof(T).Name; 
     return name.Substring(0, Math.Max(name.LastIndexOf(nameof(Controller), 
              StringComparison.CurrentCultureIgnoreCase), 0)); 
    } 
} 

और तुम इस तरह इसका इस्तेमाल कर सकते हैं:

public ActionResult Foo() 
{ 
    return RedirectToAction(nameof(HomeController.Index), 
          Utilities.ControllerName<HomeController>()); 
} 
संबंधित मुद्दे