এএসপি.এনইটি এমভিসি সম্পর্কিত সম্পর্কিত পাথ


101

আমার অ্যাপ্লিকেশনগুলিতে আমাকে প্রায়শই আপেক্ষিক পথ ব্যবহার করতে হয়। উদাহরণস্বরূপ, আমি যখন জিকুয়েরি উল্লেখ করি তখন আমি সাধারণত এটি করে থাকি:

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

এখন যেহেতু আমি এমভিসিতে স্থানান্তর করছি, মূলটির তুলনায় আমার কোনও পৃষ্ঠাতে থাকা বিভিন্ন পাথের জন্য অ্যাকাউন্ট করতে হবে। এটি পূর্ববর্তী সময়ে ইউআরএল পুনর্লিখনের ক্ষেত্রে অবশ্যই একটি সমস্যা ছিল, তবে আমি ধারাবাহিক পথ ব্যবহার করে এটিকে ঘিরে কাজ করতে সক্ষম হয়েছি।

আমি জানি যে স্ট্যান্ডার্ড সমাধানটি হ'ল নিখুঁত পাথগুলি ব্যবহার করা যেমন:

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

তবে এটি আমার পক্ষে উন্নয়ন চক্রের মতো কাজ করবে না, আমাকে একটি পরীক্ষা মেশিনে মোতায়েন করতে হবে যার উপর অ্যাপটি ভার্চুয়াল ডিরেক্টরিতে চালিত হবে। রুট পরিবর্তিত হলে রুট আপেক্ষিক পাথ কাজ করে না। এছাড়াও, রক্ষণাবেক্ষণের কারণে, আমি পরীক্ষা নিযুক্ত করার সময়কালের জন্য সমস্ত পথগুলি সহজেই পরিবর্তন করতে পারি না - এটি নিজেই একটি দুঃস্বপ্ন হবে।

তাহলে সবচেয়ে ভাল সমাধান কি?

সম্পাদনা করুন:

যেহেতু এই প্রশ্নটি এখনও দেখেছে এবং উত্তর পেয়েছে, আমি ভেবেছিলাম যে এটি আপডেট করার জন্য এটি আপডেট করা বুদ্ধিমানের হতে পারে যে রেজার ভি 2 হিসাবে, মূল-আপেক্ষিক ইউআরএলগুলির জন্য সমর্থন বেক করা হয়েছে, তাই আপনি ব্যবহার করতে পারেন

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

কোনও সার্ভার-সাইড সিনট্যাক্স ছাড়াই, এবং ভিউ ইঞ্জিন স্বয়ংক্রিয়ভাবে site / বর্তমান সাইটের রুট যা-ই হোক না কেন তার সাথে প্রতিস্থাপন করে।

উত্তর:


93

এটা চেষ্টা কর:

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

অথবা MvcCrib ব্যবহার করুন এবং এটি করুন:

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

4
এটি প্রায়শই জিজ্ঞাসিত হয় এটি প্রায়শই জিজ্ঞাসিত প্রশ্নাগুলি হওয়া উচিত, আমি মনে করি তাদের টেমপ্লেটে একটি উদাহরণ অন্তর্ভুক্ত করা দরকার।
সাইমন স্টিল

আশ্চর্যজনক, এটি সত্যিই আমাকে বাঁধন থেকে বের করে দিয়েছে। ধন্যবাদ!
জেয়ার্ড

4
(আমি জানি এই পোস্টটি পুরানো) - <% = আরল.কন্টেন্ট ব্যবহার করে না ("~ / স্ক্রিপ্টস / jquery-1.2.6.js")%> সার্ভারটি পথটি রেন্ডার করে তোলে, অন্যদিকে, আপনি যদি "/ স্ক্রিপ্টস / jquery-1.2.6.js ", এটি কেবল ক্লায়েন্টের কাছে সরাসরি পরিবেশন করা হবে, সুতরাং, সার্ভারের আরও একটি জিনিস হ্রাস করতে হবে? আমি ভেবেছিলাম সার্ভার প্রক্রিয়াটি আপনি যত বেশি এড়াতে পারবেন তেমন কোথাও পড়তে পারেন, আরও ভাল - বিশেষত * .js পাথের মতো স্থির সামগ্রী সহ? আমি বুঝতে পারি এটি ন্যূনতম সংস্থান ব্যবহার করে তবে আপনার অ্যাপটিতে যদি কয়েক লক্ষ / হাজার ইউআরএল কনটেন্ট () থাকে, তবে এটি কয়েক ন্যানো সেকেন্ড ছেঁটে ফেলেছে, না?
লসবার তার

53

একটি পুরানো পোস্টের সময়, নতুন পাঠকদের জানা উচিত যে রেজার 2 এবং তার পরে (এমভিসি 4 + এ ডিফল্ট) এই সমস্যাটিকে পুরোপুরি সমাধান করে।

রেজার 1 সহ পুরাতন এমভিসি 3:

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

রেজার 2 এবং তারপরে নতুন এমভিসি 4

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

কোনও বিশ্রী রেজার ফাংশনের মতো সিনট্যাক্স নেই। কোনও অ-মানক মার্কআপ ট্যাগ নেই।

টিলড ('~') দিয়ে যে কোনও এইচটিএমএল বৈশিষ্ট্যগুলিতে কোনও পাথের উপসর্গ স্থাপন করে রেজার 2 কে সঠিক পথটি স্থির করে "কেবল এটির কাজ করতে" বলে। এটা দুর্দান্ত।


হ্যাঁ, এবং ~ / উপসর্গটি বিশ্লেষণের সরলতা দেওয়া, আমি অবাক হয়েছি কেন এ জাতীয় কিছু শুরু থেকেই ASP.NET তে অন্তর্নির্মিত হয়নি।
ক্রিস

4
আমি প্রায়শই দেখতে পেয়েছি যে নকশাটি যত সহজ, তত বেশি চিন্তা এতে চলে গেছে।
চার্লস বার্নস

4
এই উত্তরটি সামান্য বিভ্রান্তিকর। এমভিসি 4 এর জন্য পোস্ট করা সিনট্যাক্স আসলে রেজার ইঞ্জিনের উপর নির্ভরশীল। এটি কোনও বিশেষ মার্কআপ ব্যবহার করতে পারে না তবে কেবল রেজার ভি 2 + ইঞ্জিন সঠিকভাবে দেখানো সিনট্যাক্স পরিচালনা করে।
ক্রিস

4
আপনি ঠিক বলেছেন, ক্রিস। আমি এই প্রতিফলিত উত্তর আপডেট করেছি।
চার্লস বার্নস

10

ব্রেকিং পরিবর্তন - এমভিসি 5

এমভিসি 5-তে ব্রেকিং পরিবর্তনের জন্য সতর্ক থাকুন ( এমভিসি 5 রিলিজ নোট থেকে )

Url পুনর্লিখন এবং টিল্ড (de)

এএসপি.নেট রেজার 3 বা এএসপি.নেট এমভিসি 5 তে আপগ্রেড করার পরে, আপনি যদি ইউআরএল পুনর্লিখন ব্যবহার করেন তবে টিল্ড (~) স্বরলিপিটি আর সঠিকভাবে কাজ করতে পারে না। URL টি লেখা যেমন এইচটিএমএল উপাদানের মধ্যে টিল্ড (~) স্বরলিপি প্রভাবিত <A/>, <SCRIPT/>, <LINK/>, এবং এর ফলে টিল্ড আর রুট ডিরেক্টরিতে মানচিত্র তৈরী করে।

উদাহরণস্বরূপ, যদি আপনি জন্য অনুরোধ পুনর্লিখন যদি asp.net/content করার asp.net মধ্যে href বৈশিষ্ট্যটির <A href="~/content/"/>করার সমাধান করা / বিষয়বস্তু / বিষয়বস্তু / পরিবর্তে / । এই পরিবর্তনটি দমন করতে, আপনি প্রতিটি ওয়েব পৃষ্ঠায় বা গ্লোবাল.এক্সে অ্যাপ্লিকেশন_বেগিনেরউইক্টে আইআইএস_ওয়াসউরআরলিখন প্রসঙ্গটি মিথ্যাতে সেট করতে পারেন ।

তারা কীভাবে এটি করবেন তা আসলে ব্যাখ্যা করে না তবে আমি এই উত্তরটি পেয়েছি :

আপনি যদি আইআইএস 7 ইন্টিগ্রেটেড পাইপলাইন মোডে চালাচ্ছেন তবে নিম্নলিখিতটি আপনার মধ্যে রাখার চেষ্টা করুন Global.asax:

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

দ্রষ্টব্য: আপনার সমস্যাটি কি তা নিশ্চিত হওয়ার জন্য আপনি প্রথমে Request.ServerVariablesপ্রকৃতপক্ষে রয়েছে যাচাই করতে চাইতে পারেন IIS_WasUrlRewritten


পুনশ্চ. আমি ভেবেছিলাম আমার এমন পরিস্থিতি হয়েছিল যেখানে আমার সাথে এটি src="~/content/..."ঘটছিল এবং আমি আমার এইচটিএমএলতে ইউআরএলস তৈরি করছিলাম - তবে আমার কোডটি সংকলিত হচ্ছিল এমন কিছু সতেজ হয়ে উঠেনি। লেআউট এবং পৃষ্ঠা সিটিএসটিএমএল ফাইলগুলি সম্পাদনা এবং পুনরায় সংরক্ষণ করা কোনওরকম কিছুতে কাজ করার জন্য ট্রিগার করেছিল।


6

এএসপি.নেটে আমি সাধারণত ব্যবহার করি <img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>। এএসপি.নেট এমভিসি তে কেন একই ধরণের সমাধান কাজ করা উচিত তা আমি দেখতে পাচ্ছি না।


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

আমি কি ব্যবহার করেছি। আপনার উদাহরণ মেলে পথ পরিবর্তন করুন।


5

এটির মূল্যের জন্য, আমি কেবল রাস্তাগুলি সমাধান করার জন্য সার্ভার ট্যাগ দিয়ে আমার অ্যাপ্লিকেশন লিটারের ধারণাটিকে ঘৃণা করি, তাই আমি আরও কিছু গবেষণা করেছি এবং লিঙ্কগুলি পুনরায় লেখার জন্য যা চেষ্টা করেছি এমন কিছু ব্যবহার করার সিদ্ধান্ত নিয়েছি - একটি প্রতিক্রিয়া ফিল্টার। এইভাবে, আমি পরিচিত উপসর্গের সাথে সমস্ত নিখুঁত পাথগুলিকে উপসর্গ করতে পারি এবং রেসপন্স ব্যবহার করে রানটাইম এ এটি প্রতিস্থাপন করতে পারি time ফিল্টার অবজেক্ট এবং অপ্রয়োজনীয় সার্ভার ট্যাগ সম্পর্কে চিন্তা করার দরকার নেই। কোডটি অন্য কাউকে সহায়তা করবে ক্ষেত্রে নীচে পোস্ট করা হয়েছে help

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);
        }
    }
}

4

এমভিসি 3 এর জন্য রেজার ভিউ ইঞ্জিনটি ভার্চুয়াল-রুটের আপেক্ষিক পাথগুলি রান-টাইমে যথাযথভাবে সমাধান করা ব্যবহার করা আরও সহজ এবং পরিষ্কার করে তোলে। ইউআরএল কনটেন্ট () পদ্ধতিটি কেবল href বৈশিষ্ট্য মানের মধ্যে ফেলে দিন এবং এটি সঠিকভাবে সমাধান করবে।

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

1

ক্রিসের মতো, আমি আমার ক্লিন মার্কআপের ভিতরে স্ফুটিত সার্ভার-সাইড ট্যাগগুলি নিখুঁতভাবে মূর্খ জিনিসটি মূল থেকে উপরের দিকে তাকানোর জন্য বলতে চাই না। এটি জিজ্ঞাসা করা খুব সহজ, যুক্তিসঙ্গত জিনিস হওয়া উচিত। তবে এ জাতীয় কোনও সাধারণ কাজ করার জন্য কোনও কাস্টম সি # ক্লাস লেখার প্রয়াসে যেতে হবে এমন ধারণাটিও আমি ঘৃণা করি, কেন আমার তা করা উচিত? সময় কি একটি বর্জ্য।

আমার জন্য, আমি কেবল "পারফেকশন" এর সাথে আপস করেছি এবং আমার পথের রেফারেন্সগুলির মধ্যে ভার্চুয়াল ডিরেক্টরিটির মূল পাথের নামটিকে হার্ডকড করেছি। সুতরাং এটি পছন্দ:

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

URL টি সমাধানের জন্য কোনও সার্ভার-সাইড প্রসেসিং বা সি # কোডের প্রয়োজন নেই, যা পারফরম্যান্সের জন্য সবচেয়ে ভাল যদিও আমি জানি এটি নির্বিশেষে নির্বিশেষে হবে। এবং আমার সুন্দর ক্লিন মার্কআপে কোনও ফোলানো কুশল সার্ভার-সাইড বিশৃঙ্খলা নেই।

আমি কেবল এই হার্ডকডযুক্ত তা জেনে বেঁচে থাকতে পারি এবং যখন জিনিসটি http: // MyDevServer / MyProject / এর পরিবর্তে কোনও সঠিক ডোমেনে স্থানান্তরিত হয় তখন তা সরানো দরকার removed

চিয়ার্স


4
আপনাকে 0 এ ফিরিয়ে আনার জন্য আমি ভোট দিয়েছি your খাঁটি সি # তে 5 বছর পরে আমি ওয়েবে ডেভে নতুন এবং স্প্যাগেটি বিশৃঙ্খলার ভূমি কী ধ্বংসাত্মক তা সবই is
লুক পুপলেট 20

আপনার কোনও নেস্টেড ওয়েব অ্যাপ্লিকেশনটিতে মোতায়েন করার মতো কিছু করার দরকার না হওয়া পর্যন্ত এটি গ্রহণযোগ্য আপস হিসাবে মনে হচ্ছে। রিসলভার মার্ক আপ ব্যবহার করা এটি ঠিক করবে তবে আপনার স্ট্যাটিক লিঙ্কটি নষ্ট হয়ে যাবে। উদাহরণ: আপনি বিল্ট-ইন ওয়েব সার্ভারের বিরুদ্ধে স্থানীয়ভাবে নির্মাণ করেন এবং তারপরে অ্যাপ্লিকেশনটিকে
ডোমেইন.com

এটি প্রচুর উত্পাদন পরিস্থিতিতে
ভাঙ্গবে

আমি এই সমাধানটি বেশ পছন্দ করি: চিন্তাগুলি
ডায়ান

1

গেমটি দেরীতে, তবে এই পোস্টে এএসপি.নেট পাথগুলি পরিচালনা করার খুব সম্পূর্ণ সংক্ষিপ্তসার রয়েছে।


1

আমি একটি সহজ সহায়ক পদ্ধতি ব্যবহার করি। আপনি এটিকে সহজেই ভিউ এবং কন্ট্রোলারগুলিতে ব্যবহার করতে পারেন।

মার্কআপ:

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

সহায়ক পদ্ধতি:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.