2010-01-20 13 views
5

मैं एक सर्वोत्तम अभ्यास समाधान की तलाश में हूं जिसका उद्देश्य एएसपी.NET एप्लिकेशन में हार्ड-कोड किए गए यूआरएल की मात्रा को कम करना है।एएसपी.नेट - हार्डकोडिंग पथ से बचें

उदाहरण के लिए, जब उत्पाद विवरण स्क्रीन देखते हैं, इन विवरणों पर एक संपादन करते हैं, और फिर परिवर्तन सबमिट करते हैं, तो उपयोगकर्ता को उत्पाद प्रविष्टि स्क्रीन पर रीडायरेक्ट किया जाता है। इसके बजाय निम्नलिखित कोडिंग के:

Pages.GotoProductList("books"); 

जहां Pages आम आधार वर्ग का एक सदस्य है:

Response.Redirect("~/products/list.aspx?category=books"); 

मैं जगह में एक समाधान है कि मुझे कुछ इस तरह करने की अनुमति देता है करना चाहते हैं।

मैं बस यहां थूक रहा हूं, और किसी अन्य तरीके से सुनना अच्छा लगेगा जिसमें किसी ने भी अपना एप्लिकेशन रीडायरेक्ट प्रबंधित किया है।

संपादित

मैं निम्नलिखित समाधान बना दी: मैं पहले से ही एक आम आधार वर्ग था, जो करने के लिए मैं एक पेज enum (धन्यवाद मार्क) जोड़ा, प्रत्येक आइटम पृष्ठ के URL से युक्त एक System.ComponentModel.DescriptionAttribute विशेषता होने के साथ :

public enum Pages 
{ 
    [Description("~/secure/default.aspx")] 
    Landing, 
    [Description("~/secure/modelling/default.aspx")] 
    ModellingHome, 
    [Description("~/secure/reports/default.aspx")] 
    ReportsHome, 
    [Description("~/error.aspx")] 
    Error 
} 

फिर मैंने विभिन्न परिदृश्यों को संभालने के लिए कुछ अधिभारित विधियां बनाईं। मैं के माध्यम से यह Description विशेषता है पृष्ठ का URL प्राप्त करने के लिए प्रतिबिंब का इस्तेमाल किया है, और मैं (भी एक प्रश्न-स्ट्रिंग पैरामीटर के रूप में प्रत्येक संपत्ति जोड़ने के लिए प्रतिबिंब का उपयोग) एक गुमनाम प्रकार के रूप में क्वेरी स्ट्रिंग पैरामीटर भेजने:

private string GetEnumDescription(Enum value) 
{ 
    Type type = value.GetType(); 
    string name = Enum.GetName(type, value); 

    if (name != null) 
    { 
     FieldInfo field = type.GetField(name); 
     if (field != null) 
     { 
      DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; 

      if (attr != null) 
       return attr.Description; 
     } 
    } 

    return null; 
} 

protected string GetPageUrl(Enums.Pages target, object variables) 
{ 
    var sb = new StringBuilder(); 
    sb.Append(UrlHelper.ResolveUrl(Helper.GetEnumDescription(target))); 

    if (variables != null) 
    { 
     sb.Append("?"); 
     var properties = (variables.GetType()).GetProperties(); 

     foreach (var property in properties) 
      sb.Append(string.Format("{0}={1}&", property.Name, property.GetValue(variables, null))); 
    } 

    return sb.ToString(); 
} 

protected void GotoPage(Enums.Pages target, object variables, bool useTransfer) 
{ 
    if(useTransfer) 
     HttpContext.Current.Server.Transfer(GetPageUrl(target, variables)); 
    else 
     HttpContext.Current.Response.Redirect(GetPageUrl(target, variables)); 
} 

एक सामान्य कॉल तब ऐसा दिखाई देगा:

GotoPage(Enums.Pages.Landing, new {id = 12, category = "books"}); 

टिप्पणियां?

उत्तर

4

मैं सुझाव देंगे कि आप पृष्ठ वर्ग से अपना खुद का वर्ग ("MyPageClass") निकाले जाते हैं और वहाँ इस विधि में शामिल हैं:

public class MyPageClass : Page 
{ 
    private const string productListPagePath = "~/products/list.aspx?category="; 
    protected void GotoProductList(string category) 
    { 
     Response.Redirect(productListPagePath + category); 
    } 
} 

फिर, अपने codebehind में, सुनिश्चित करें कि आपके पेज इस से निकला बनाने वर्ग:

public partial class Default : MyPageClass 
{ 
     ... 
} 
कि भीतर

, तुम बस का उपयोग करके अनुप्रेषित कर सकते हैं:

GotoProductList("Books"); 

अब, यह थोड़ी सीमित है क्योंकि निस्संदेह आपके पास उत्पादसूची पृष्ठ जैसे कई अन्य पृष्ठ होंगे। आप उनमें से प्रत्येक को अपने पृष्ठ वर्ग में अपनी विधि दे सकते हैं लेकिन यह एक प्रकार का दाढ़ी है और आसानी से एक्स्टेंसिबल नहीं है।

मैं इसमें एक पेज नाम/फ़ाइल नाम मैपिंग के साथ एक डीबी टेबल रखकर इस तरह की एक समस्या हल करता हूं (मैं बाहरी, गतिशील रूप से एचटीएमएल फाइलों को कॉल कर रहा हूं, एएसपीएक्स फाइल नहीं, इसलिए मेरी ज़रूरतें थोड़ी अलग हैं लेकिन मुझे लगता है कि सिद्धांत लागू होते हैं)।आपका कॉल तो या तो एक स्ट्रिंग का प्रयोग करेंगे या, बेहतर अभी तक, एक enum रीडायरेक्ट करने के लिए:

protected void GoToPage(PageTypeEnum pgType, string category) 
{ 
     //Get the enum-to-page mapping from a table or a dictionary object stored in the Application space on startup 
     Response.Redirect(GetPageString(pgType) + category); // *something* like this 
} 

अपने पृष्ठ से अपने कॉल होगा: GoToPage (enumProductList, "किताबें");

अच्छी बात यह है कि कॉल एक पूर्वजों वर्ग (चारों ओर गुजरने या प्रबंधक वस्तुओं को बनाने की आवश्यकता नहीं है) में परिभाषित एक फ़ंक्शन के लिए है और पथ बहुत स्पष्ट है (अगर आप एक enum का उपयोग करते हैं तो इंटेलिजेंस आपकी सीमाओं को सीमित कर देगा)।

शुभकामनाएं!

+0

मैंने इस तरह कुछ ऐसा करने के लिए समाप्त किया (ऊपर संपादित देखें), और इसे स्वीकार किए जाने के रूप में चिह्नित किया जाएगा क्योंकि मैंने पेज एनम विचार का उपयोग किया था। धन्यवाद मार्क। – staterium

1

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

1

आपके पास यहां बड़ी संख्या में विकल्प उपलब्ध हैं। डेटाबेस तालिका या एक्सएमएल फ़ाइल शायद सबसे अधिक इस्तेमाल किए जाने वाले उदाहरण हैं।

// Please note i have not included any error handling code. 
public class RoutingHelper 
{ 
    private NameValueCollecton routes; 

    private void LoadRoutes() 
    { 
     //Get your routes from db or config file 
     routes = /* what ever your source is*/ 
    } 

    public void RedirectToSection(string section) 
    { 
     if(routes == null) LoadRoutes(); 

     Response.Redirect(routes[section]); 
    } 
} 

यह सिर्फ नमूना कोड है, और इसे किसी भी तरह से लागू किया जा सकता है। मुख्य प्रश्न जो आपको सोचने की जरूरत है वह है जहां आप मैपिंग स्टोर करना चाहते हैं। एक साधारण एक्सएमएल फ़ाइल यह कर सकती है:

`<mappings> 
    <map name="Books" value="/products.aspx/section=books"/> 
    ... 
</mappings>` 

और फिर बस अपने मार्ग संग्रह में लोड करें।

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