5

वर्तमान में मैं इस तरह एक फ़ोल्डर संरचना है:MVC क्षेत्रों रूटिंग - नियंत्रक फ़ोल्डर फ़ोल्डर के साथ

Area (folder) 
- Toolkit (folder) 
    - Controllers (folder) 
     - AdminController.cs 
    - Views (folder) 
     - Admin (folder) 
      - Privledges (folder) 
       - Create.cshtml 
       - Edit.cshtml 
       - Delete.cshtml 

कौन सा

/Toolkit/{controller}/{action}/{tool}/{id} 

करने के लिए अनुवाद यह एक बुरा व्यवहार व्यवहार करने के लिए कार्रवाई की स्थापना के लिए है एक कंट्रोलर की तरह जो स्ट्रिंग {टूल} पैरामीटर और पैरामीटर {id} के आधार पर एक दृश्य को कार्य करता है, जो कार्रवाई में पास हो जाता है?

है कि मैं क्या बात कर रहा हूँ के कार्यान्वयन:

private const string FOLDER_PRIVILEGES = "./Privileges/"; 

    public ActionResult Privileges(string tool, string id = "") 
    { 
     dynamic viewModel = null; 
     ToolViews view; // enum for the views 
     // Parse the tool name to get the enum representation of the view requested 
     bool isParsed = Enum.TryParse(tool, out view); 

     if (!isParsed) 
     { 
      return HttpNotFound(); 
     } 

     switch (view) 
     { 
      case ToolViews.Index: 
       viewModel = GetIndexViewModel(); // call a function that gets the VM 
       break; 
      case ToolViews.Edit: 
       viewModel = GetEditViewModelById(int.Parse(id)); // sloppy parse 
       break; 
      default: 
       viewModel = GetIndexViewModel(); 
       break; 
     } 
     // The folder path is needed to reach the correct view, is this bad? 
     // Should I just create a more specific controller even though it would 
     // require making about 15-20 controllers? 
     return View(FOLDER_PRIVILEGES + tool, viewModel); 
    } 

जब मैं एक दृश्य लिखते हैं, मुझे यकीन है कि पथ नाम फ़ोल्डर के लिए प्रयोग किया जाता है बनाने के लिए

@Html.ActionLink("Edit", "./Toolkit/Admin/Priveleges/Edit", "Admin", new { id = item.id }) 

यह लगता है एक खराब अभ्यास हो, क्योंकि यदि फ़ोल्डर संरचना बिल्कुल बदलती है तो उसे बहुत से रखरखाव की आवश्यकता होगी।

हालांकि, अगर मुझे नियंत्रकों में कार्रवाइयों को तोड़ना है तो उनमें से कई (लगभग 20 समय के साथ अधिक जोड़े गए) होंगे।

यदि मैं जो कर रहा हूं वह एक बुरा अभ्यास है, तो इस तरह के मार्ग की सेवा करने का सबसे अच्छा तरीका क्या होगा?

/Toolkit/Admin/Privileges/Edit/1 

मैं करना चाहते से बचने कर निम्नलिखित:

/Toolkit/Admin/CreatePrivileges/1 
/Toolkit/Admin/EditPrivileges/1 
/Toolkit/Admin/DeletePrivileges/1 

कृपया मुझे बताएं कि मैं कोई मतलब नहीं बना रही हूँ करते हैं, क्योंकि मैं में इस सवाल डाल एक कठिन समय चल रहा है शब्द।

+0

शायद मैं गलतफहमी कर रहा हूं, लेकिन अपने पैटर्न का उपयोग करने के लिए आप 'टूल व्यू' एनम के आधार पर उपयुक्त दृश्य मॉडल को वापस करने के लिए एक अलग फ़ंक्शन नहीं बनाने जा रहे हैं? एमवीसी का पूरा बिंदु कॉन्फ़िगरेशन पर सम्मेलन है। चूंकि एमवीसी में सम्मेलन प्रत्येक अलग संभावना को संभालने के लिए एक अलग कार्रवाई है, ऐसा लगता है कि यह आपके दूसरे उदाहरण के साथ जाने के लिए "सर्वोत्तम अभ्यास" है। आईई:/टूलकिट/एडमिन/CreatePrivileges/1। –

+0

मैंने फैसला किया है कि अगर मैं एक पाचन यूआरएल चाहता हूं तो मुझे इसे छोटे नियंत्रकों में तोड़ने की जरूरत है। यह नियंत्रकों का एक समूह होने के लिए थोड़ा परेशान हो सकता है, लेकिन इससे पहले कि मैं पहले क्या करने की कोशिश कर रहा था उससे बेहतर है। करने/टूलकिट/व्यवस्थापक/CreatePrivileges/1 के बजाय मेरे पास/टूलकिट/विशेषाधिकार/बनाएँ/1 है। मुझे एहसास हुआ कि एक बार मेरे पास एकाधिक, छोटे नियंत्रक होने के बाद/व्यवस्थापक/भाग वास्तव में यूआरएल से कोई फर्क नहीं पड़ता था। –

+0

तो मुझे लगता है कि हम सहमत हैं? –

उत्तर

1

मुझे लगता है कि आप एमवीसी में एक सम्मेलन को मजबूर करने की कोशिश कर रहे हैं जो इसके संरेखण के इरादे से गुजरता है।

एमवीसी के साथ, आपका नियंत्रक एक संज्ञा है, और आपकी क्रिया एक क्रिया है। अपने उदाहरण का उपयोग करना, तुम हो:

  • टूलकिट (संज्ञा) - क्षेत्र
    • व्यवस्थापक (? संज्ञा) - उप क्षेत्र? < - यह एक है कि एक छोटे से अजीब है
      • विशेषाधिकार (संज्ञा) - नियंत्रक
        • बनाएं (क्रिया) - लड़ाई
        • संपादित करें (क्रिया) - लड़ाई
        • हटाएँ (क्रिया) - लड़ाई

तो जैसा कि आप देख सकते हैं, यदि आप Toolkit + Admin को क्षेत्र + subarea के रूप में देख सकते हैं, या उन्हें एक क्षेत्र (TookitAdmin) में जोड़ सकते हैं, तो यह आपको नियंत्रकों और कार्यों के लिए मूल उद्देश्य पर वापस ले जाएगा।

टिप्पणियों के आधार पर, ऐसा लगता है कि आपने इस तरह से जाने का फैसला किया होगा। लेकिन मैं यह इंगित करना चाहता था कि एक निष्कर्ष जिस तरह से आप आया था वह एमवीसी की जड़ों पर वापस आ रहा है।

एक साइड नोट के रूप में, क्या आपने एमवीसी 4 पर जाने पर विचार किया है? इसका Web API एक विश्वसनीय API के लिए बेहतर समर्थन प्रदान करता है, जो ऐसा लगता है कि आप इसे प्राप्त करने का प्रयास कर रहे हैं।

+0

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

1

मूल प्रश्न का उत्तर नहीं है, लेकिन ओपी ने प्रत्येक कार्रवाई में enum की जांच करने के बजाय एनम बाधा के नमूने के लिए कहा। अर्थात्:

// Parse the tool name to get the enum representation of the view requested 
bool isParsed = Enum.TryParse(tool, out view); 

if (!isParsed) 
{ 
    return HttpNotFound(); 
} 

इसके बजाय एक स्ट्रिंग के रूप enum मूल्य (उपकरण, इस मामले में) स्वीकार करने के लिए होने की, तो आप मूल्य अपनी कार्रवाई पहले से ही उचित enum के रूप में कास्ट में आने के लिए मजबूर कर सकते हैं। इसका एक अतिरिक्त लाभ यह है कि एमवीसी ढांचा इस मामले में सही प्रतिक्रिया (HttpNotFound) लौटने का ख्याल रखेगा।

यह आपकी बाधा विधि है। यह किसी भी प्रकार के Enum स्वीकार करता है। प्रत्येक एनम के लिए अलग बाधा बनाने की कोई आवश्यकता नहीं है।

public class EnumConstraint<T> : IRouteConstraint where T : struct 
{ 
    private readonly HashSet<string> enumNames; 
    public EnumConstraint() 
    { 
     string[] names = Enum.GetNames(typeof(T)); 
     this.enumNames = new HashSet<string>(from name in names select name.ToLowerInvariant()); 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return this.enumNames.Contains(values[parameterName].ToString().ToLowerInvariant()); 
    } 

} 

फिर, अपने RegisterRoutes विधि (MVC4) या global.asax.cs पेज (MVC3) में, आप बस अपने मार्ग इस तरह रजिस्टर:

routes.MapRoute(
    url: "/Toolkit/Admin/{Action}/{id}", 
    constraints: new { Action = new EnumConstraint<ToolViews>(), id = @"\d+" } 
); 

मैं भी पर एक नंबर बाधा जोड़ा id पैरामीटर आपको उस पर पार्स करने के लिए भी बचाता है।

मुझे बताएं कि यह आपके लिए कैसे काम करता है।

+0

यह बेहद सहायक है। आपका बहुत बहुत धन्यवाद! –

+0

@ डेविड - मदद करने के लिए खुशी हुई –

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