दिलचस्प पोस्ट
एक समय में सभी गतिविधियों को समाप्त करें सी # स्वत: पूर्ण HTTP हेडर सेट करना मैक ओएस एक्स में clock_gettime विकल्प कक्षा में वैश्विक चर का उपयोग करें विजुअल स्टूडियो के अंतर्निहित एएसपी.नेट डेवलपमेंट सर्वर के साथ HTTPS कैसे बनाने के लिए एकाधिक क्वेरी कहाँ क्वेरी क्वेरी Laravel Eloquent? ईसी 2 उदाहरण के लिए कुंजी युग्म बदलें keytool त्रुटि Keystore के साथ छेड़छाड़ किया गया था, या पासवर्ड गलत था जीपीए का उपयोग करके मानचित्र <स्ट्रिंग, स्ट्रिंग> संग्रहीत करना मापदंडों के साथ डीजेन्गा रिटर्न डायरेक्ट () वर्ग और इंस्टेंस चर के बीच अंतर क्या है? मध्यम ट्रस्ट को खो दिया कारण के लिए विकसित करने की कोशिश कर रहा है? क्या सी ++ में मुख्य हस्ताक्षर के तर्कों में अनग्रेड और कॉन्स्ट क्वालिफायर हैं? मैं गतिशील रूप से एक जावा सरणी में आइटम कैसे जोड़ सकता हूं?

ASP.NET MVC सापेक्ष पथ

मेरे अनुप्रयोगों में, मुझे अक्सर सापेक्ष पथ का उपयोग करना पड़ता है उदाहरण के लिए, जब मैं JQuery का संदर्भ देता हूं, तो मैं आमतौर पर ऐसा ही करता हूं:

<script type="text/javascript" src="../Scripts/jquery-1.2.6.js"></script> 

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

मुझे पता है कि मानक समाधान पूर्ण पथ का उपयोग करना है जैसे कि:

 <script type="text/javascript" src="/Scripts/jquery-1.2.6.js"></script> 

लेकिन यह मेरे लिए विकास चक्र के दौरान काम नहीं करेगा, मुझे एक परीक्षण मशीन पर तैनात करना होगा जिस पर ऐप वर्चुअल निर्देशिका में चलेगा। जड़ परिवर्तन जब रूट सापेक्ष पथ काम नहीं करते। इसके अलावा, रखरखाव के कारणों के लिए, मैं परीक्षण की तैनाती की अवधि के लिए बस सभी रास्ते नहीं बदल सकता – यह अपने आप में एक दुःस्वप्न होगा

तो सबसे अच्छा समाधान क्या है?

संपादित करें:

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

 <img src="~/Content/MyImage.jpg"> 

किसी भी सर्वर-साइड सिंटैक्स के बिना, और दृश्य इंजन स्वचालित रूप से वर्तमान स्थान रूट के साथ ~ / के स्थान को बदल देता है

वेब के समाधान से एकत्रित समाधान "ASP.NET MVC सापेक्ष पथ"

इसे इस्तेमाल करे:

 <script type="text/javascript" src="<%=Url.Content("~/Scripts/jquery-1.2.6.js")%>"></script> 

या MvcContrib का उपयोग करें और ऐसा करें:

 <%=Html.ScriptInclude("~/Content/Script/jquery.1.2.6.js")%> 

एक पुरानी पोस्ट करते समय, नए पाठकों को पता होना चाहिए कि रेज़र 2 और बाद में (MVC4 + में डिफ़ॉल्ट) इस समस्या को पूरी तरह से हल करता है।

रेज़र 1 के साथ ओल्ड एमवीसी 3:

 <a href="@Url.Content("~/Home")">Application home page</a> 

रेज़र 2 और बाद के संस्करण के साथ नई MVC4:

 <a href="~/Home">Application home page</a> 

कोई अजीब रेजर फ़ंक्शन जैसी सिंटैक्स नहीं। कोई गैर-मानक मार्कअप टैग नहीं

टिल्ड ('~') वाले किसी भी एचटीएमएल विशेषताओं के पथ को प्रीफ़िक्स करना रेजर 2 को सही पथ को प्रतिस्थापित करके "बस इसे काम करना" बताता है। यह बहुत अच्छा है।

तोड़कर बदलाव – एमवीसी 5

एमवीसी 5 में बदलाव को बदलने के लिए देखें ( एमवीसी 5 रिलीज नोट्स से )

यूआरएल रीराइट और टिल्ड (~)

एएसपी.नेट रेज़र 3 या एएसपी.नेट एमवीसी 5 में अपग्रेड करने के बाद, टिल्ड (~) नोटेशन अब ठीक से काम नहीं कर सकता है अगर आप यूआरएल रीरलाईट का उपयोग कर रहे हैं। यूआरएल पुनर्लेखन एचटीएमएल तत्वों जैसे टिल्ड (~) नोटेशन को प्रभावित करता है जैसे कि <A/> , <SCRIPT/> , <LINK/> , और नतीजतन टिल्ड रूट निर्देशिका तक मैप्स नहीं रह जाता है

उदाहरण के लिए, यदि आप asp.net/content से asp.net के लिए अनुरोधों को फिर से लिखना चाहते हैं, तो <A href="~/content/"/> href <A href="~/content/"/> content / content <A href="~/content/"/> में / href / इस परिवर्तन को दबाने के लिए, आप IIS_WasUrlRewrit संदर्भ प्रत्येक वेब पेज में या Global_BaccessRequest में Global.asax में सेट कर सकते हैं।

वे वास्तव में यह नहीं समझाते कि यह कैसे करना है, लेकिन फिर मुझे यह जवाब मिला:

यदि आप IIS 7 एकीकृत पाइपलाइन मोड में चल रहे हैं तो अपने Global.asax में निम्नलिखित को डालने का प्रयास करें:

  protected void Application_BeginRequest(object sender, EventArgs e) { Request.ServerVariables.Remove("IIS_WasUrlRewritten"); } 

नोट: आप IIS_WasUrlRewritten को जांचना चाह सकते हैं। IIS_WasUrlRewritten वास्तव में IIS_WasUrlRewritten में शामिल हैं, यह सुनिश्चित करने के लिए पहले कि यह आपकी समस्या है


पुनश्च। मैंने सोचा कि मेरे पास ऐसी स्थिति थी जहां यह मेरे साथ हो रहा था और मुझे src="~/content/..." यूआरएल को मेरे एचटीएमएल में उत्पन्न किया गया था – लेकिन यह पता चला कि मेरे कोड को संकलित किया जा रहा है, तो कुछ रीफ़्रेश नहीं था। लेआउट और पेज सीएसएसएम फाइलों को संपादित और सहेजने से किसी तरह से काम करने के लिए कुछ काम शुरू हो गया।

ASP.NET में मैं आमतौर पर <img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/> । मुझे नहीं पता है कि एएसपी.नेट एमवीसी में एक समान समाधान क्यों काम नहीं करना चाहिए।

 <script src="<%=ResolveUrl("~/Scripts/jquery-1.2.6.min.js") %>" type="text/javascript"></script> 

क्या मैं इस्तेमाल किया अपने उदाहरण से मेल करने के लिए पथ बदलें

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

 using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Web; namespace Demo { public class PathRewriter : Stream { Stream filter; HttpContext context; object writeLock = new object(); StringBuilder sb = new StringBuilder(); Regex eofTag = new Regex("</html>", RegexOptions.IgnoreCase | RegexOptions.Compiled); Regex rootTag = new Regex("/_AppRoot_", RegexOptions.IgnoreCase | RegexOptions.Compiled); public PathRewriter(Stream filter, HttpContext context) { this.filter = filter; this.context = context; } public override void Write(byte[] buffer, int offset, int count) { string temp; lock (writeLock) { temp = Encoding.UTF8.GetString(buffer, offset, count); sb.Append(temp); if (eofTag.IsMatch(temp)) RewritePaths(); } } public void RewritePaths() { byte[] buffer; string temp; string root; temp = sb.ToString(); root = context.Request.ApplicationPath; if (root == "/") root = ""; temp = rootTag.Replace(temp, root); buffer = Encoding.UTF8.GetBytes(temp); filter.Write(buffer, 0, buffer.Length); } public override bool CanRead { get { return true; } } public override bool CanSeek { get { return filter.CanSeek; } } public override bool CanWrite { get { return true; } } public override void Flush() { return; } public override long Length { get { return Encoding.UTF8.GetBytes(sb.ToString()).Length; } } public override long Position { get { return filter.Position; } set { filter.Position = value; } } public override int Read(byte[] buffer, int offset, int count) { return filter.Read(buffer, offset, count); } public override long Seek(long offset, SeekOrigin origin) { return filter.Seek(offset, origin); } public override void SetLength(long value) { throw new NotImplementedException(); } } public class PathFilterModule : IHttpModule { public void Dispose() { return; } public void Init(HttpApplication context) { context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState); } void context_ReleaseRequestState(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; if (app.Response.ContentType == "text/html") app.Response.Filter = new PathRewriter(app.Response.Filter, app.Context); } } } 

एमवीसी 3 के लिए रेज़र व्यू इंजिन रन-टाइम में ठीक से हल किए गए वर्चुअल-रूट सापेक्ष पथ का उपयोग करने में आसान और क्लीनर बनाता है। बस url.Content () विधि को href विशेषता मान में छोड़ दें और यह ठीक से हल होगा।

 <a href="@Url.Content("~/Home")">Application home page</a> 

खेल के लिए देर हो चुकी है, लेकिन इस पोस्ट में एएसपी.Net पथ से निपटने का एक बहुत पूरा सारांश है।

मैं एक साधारण सहायक विधि का उपयोग करता हूँ आप आसानी से दृश्यों और नियंत्रकों में इसका उपयोग कर सकते हैं।

मार्कअप:

 <a href=@Helper.Root()/about">About Us</a> 

सहायक विधि:

 public static string Root() { if (HttpContext.Current.Request.Url.Host == "localhost") { return ""; } else { return "/productionroot"; } } 

मैं एक अलग दृष्टिकोण के साथ गया था जो एक समान SO पोस्ट पर आधारित था, लेकिन बहुत कम कोड के साथ …

http://a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript

क्रिस की तरह, मैं वास्तव में अपने साफ मार्कअप के अंदर फूला हुआ सर्वर-साइड टैग डालकर खड़े नहीं हो सकता, बस जड़ से ऊपर की तरफ देखने के लिए बेवकूफ चीज़ को बताने के लिए। यह पूछने के लिए एक बहुत ही सरल, उचित बात होनी चाहिए। लेकिन मैं भी ऐसी सरल बात करने के लिए किसी भी कस्टम सी # कक्षा लिखने के प्रयास में जाने के विचार से नफरत करता हूं, मुझे क्यों करना चाहिए? क्या समय की बर्बादी है।

मेरे लिए, मैं बस "पूर्णता" पर समझौता किया और मेरे पथ संदर्भों के भीतर वर्चुअल निर्देशिका के रूट पथ नाम को कठिन बना दिया। तो इस तरह से:

 <script type="text/javascript" src="/MyProject/Scripts/jquery-1.2.6.js"></script> 

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

मुझे यह जानने के साथ ही रहना होगा कि यह कठिन है और इसे हटा दिया जाना चाहिए जब यह चीज़ http: // MyDevServer / MyProject / के बजाय एक उचित डोमेन के लिए माइग्रेट हो जाएगी

चियर्स