এমভিসি 4 স্টাইলবান্ডেল চিত্রগুলি সমাধান করছে না


293

আমার প্রশ্নটি এর সাথে মিল:

এএসপি.এনইটি এমভিসি 4 মিনিফিকেশন এবং পটভূমি চিত্র

আমি যদি এমভিসির নিজস্ব বান্ডিলিংটি করতে পারি তবে আমি তার সাথে তাল মিলাতে চাই। স্টাইল স্টোন সিএসএস এবং ইমেজ সেট যেমন jQuery UI কাজের মতো স্টাইলের বান্ডিলগুলি নির্দিষ্ট করার জন্য সঠিক প্যাটার্নটি কী তা বোঝার চেষ্টা করে আমার মস্তিষ্কে ক্রাশ হচ্ছে।

আমার একটি সাধারণ এমভিসি সাইট কাঠামো /Content/css/রয়েছে যার সাথে আমার বেস সিএসএস রয়েছে styles.css। এই সিএসএস ফোল্ডারের মধ্যে আমার কাছে সাবফোল্ডারও /jquery-uiরয়েছে যেমন এর সিএসএস ফাইল যুক্ত একটি /imagesফোল্ডার রয়েছে। JQuery UI CSS এর চিত্রের পথগুলি সেই ফোল্ডারের সাথে সম্পর্কিত এবং আমি তাদের সাথে গোলযোগ করতে চাই না।

যেমনটি আমি এটি বুঝতে পারি, যখন আমি কোনও নির্দিষ্ট করি তখন StyleBundleএকটি ভার্চুয়াল পাথ নির্দিষ্ট করতে হবে যা সত্যিকারের সামগ্রীর পাথের সাথেও মেলে না, কারণ (ধরে নিই যে আমি সামগ্রীটির পথে অগ্রাহ্য করছি) আইআইএস তখন সেই পদার্থটিকে একটি প্রকৃত ফাইল হিসাবে সমাধান করার চেষ্টা করবে। সুতরাং আমি উল্লেখ করছি:

bundles.Add(new StyleBundle("~/Content/styles/jquery-ui")
       .Include("~/Content/css/jquery-ui/*.css"));

ব্যবহার করে রেন্ডার করা:

@Styles.Render("~/Content/styles/jquery-ui")

আমি অনুরোধটি করতে যেতে দেখতে পাচ্ছি:

http://localhost/MySite/Content/styles/jquery-ui?v=nL_6HPFtzoqrts9nwrtjq0VQFYnhMjY5EopXsK8cxmg1

এটি সঠিক, মাইনযুক্ত সিএসএস প্রতিক্রিয়া ফিরিয়ে দিচ্ছে। তবে ব্রাউজারটি তুলনামূলকভাবে যুক্ত লিঙ্কযুক্ত চিত্রের জন্য অনুরোধ প্রেরণ করে:

http://localhost/MySite/Content/styles/images/ui-bg_highlight-soft_100_eeeeee_1x100.png

যা ক 404

আমি বুঝতে পারি যে আমার ইউআরএল এর শেষ অংশটি jquery-uiএক্সটেনশনহীন ইউআরএল, আমার বান্ডিলের জন্য একটি হ্যান্ডলার, তাই আমি দেখতে পাচ্ছি যে চিত্রটির জন্য আপেক্ষিক অনুরোধটি কেবল কেন সহজ /styles/images/

সুতরাং আমার প্রশ্ন এই পরিস্থিতি সামাল দেওয়ার সঠিক উপায় কী?


9
নতুন বান্ডিলিং এবং মিনিফিকেশন অংশটি নিয়ে বারবার হতাশ হওয়ার পরে , আমি ক্যাসেট ডাইনিতে চলে এসেছি এখন ফ্রি এবং আরও ভালভাবে কাজ করে!
বেলেক্সানড্রে

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

এসইও কারণে সম্ভাব্য ত্রুটি যুক্ত করা: '/bundles/images/blah.jpg' পাথের জন্য নিয়ামক পাওয়া যায় নি বা আইকন্ট্রোলার প্রয়োগ করে না।
লুক পুপলেট

উত্তর:


361

এমভিসি 4 সিএসএস বান্ডিলিং এবং চিত্রের রেফারেন্সে এই থ্রেড অনুসারে আপনি যদি নিজের বান্ডেলটিকে এই হিসাবে সংজ্ঞায়িত করেন:

bundles.Add(new StyleBundle("~/Content/css/jquery-ui/bundle")
                   .Include("~/Content/css/jquery-ui/*.css"));

আপনি যেখানে বান্ডেলটি তৈরি করেছেন এমন সোর্স ফাইলগুলির মতো একই পথে বান্ডিলটি সংজ্ঞায়িত করেন, আপেক্ষিক চিত্রের পথগুলি এখনও কাজ করবে। বান্ডিল পাথের শেষ অংশটি file nameসেই নির্দিষ্ট বান্ডিলটির জন্য সত্যই (যেমন /bundleআপনার পছন্দ মতো কোনও নাম হতে পারে))

এটি কেবল তখনই কাজ করবে যদি আপনি একই ফোল্ডার (যা আমি মনে করি একটি বান্ডিলিং দৃষ্টিকোণ থেকে বোঝায়) থেকে CSS একসাথে বান্ডিল করছেন।

হালনাগাদ

@ হাও কুংয়ের নীচের মন্তব্য অনুসারে, বিকল্প হিসাবে এটি এখন CssRewriteUrlTransformation( বান্ডিল হওয়ার সাথে সাথে সিএসএস ফাইলগুলির জন্য সম্পর্কিত ইউআরএল রেফারেন্সগুলি পরিবর্তন করুন) প্রয়োগ করে অর্জন করা যেতে পারে ।

দ্রষ্টব্য: আমি ভার্চুয়াল ডিরেক্টরিতে নিখুঁত পাথগুলিতে পুনর্লিখন নিয়ে ইস্যু সম্পর্কিত মন্তব্যগুলি নিশ্চিত করি নি, সুতরাং এটি সবার (?) এর জন্য কাজ না করে।

bundles.Add(new StyleBundle("~/Content/css/jquery-ui/bundle")
                   .Include("~/Content/css/jquery-ui/*.css",
                    new CssRewriteUrlTransform()));

1
লেজেন্ড! হ্যাঁ, এটি পুরোপুরি কাজ করে। আমার বিভিন্ন স্তরে সিএসএস রয়েছে তবে সেগুলির প্রত্যেকের নিজস্ব ইমেজ ফোল্ডার রয়েছে, উদাহরণস্বরূপ আমার মূল সাইট সিএসএস মূল সিএসএস ফোল্ডারে রয়েছে এবং তারপরে jquery-ui এর ভিতরে রয়েছে নিজের ইমেজ ফোল্ডারটি, সুতরাং আমি কেবল দুটি বান্ডিল নির্দিষ্ট করেছি, আমার জন্য একটি বেস সিএসএস এবং জিকুয়ারি ইউআইয়ের জন্য একটি - যা অনুরোধের ক্ষেত্রে সম্ভবত উবার-অনুকূল নয়, তবে জীবন ছোট। চিয়ার্স!
টম ডাব্লু হল

3
হ্যাঁ দুর্ভাগ্যক্রমে, যতক্ষণ না বান্ডিলিংয়ের সিএসএসের ভিতরে এম্বেড করা ইউআরএলগুলি পুনরায় লেখার জন্য সমর্থন না পাওয়া যায়, ততক্ষণ আপনার বন্ডলিংয়ের আগে সিএসএস ফাইলগুলি মেলানোর জন্য সিএসএস বান্ডেলের ভার্চুয়াল ডিরেক্টরি প্রয়োজন। এই কারণেই ডিফল্ট টেম্পলেট বান্ডিলগুলিতে ~ / বান্ডিল / থিমগুলির মতো url নেই এবং পরিবর্তে ডিরেক্টরি কাঠামোর মতো দেখাবে: ~ / সামগ্রী / thymes / বেস / সিএসএস
হাও কুং

27
এটি এখন আইটেম ট্রান্সফর্মগুলির মাধ্যমে সমর্থিত।। "অন্তর্ভুক্ত করুন (" ~ / বিষয়বস্তু / সিএসএস / jquery-ui / *। সিএসএস ", নতুন সিএসআরইউরাইটরাল ট্রান্সফর্ম ())); 1.1 বিটা 1 তে এই সমস্যাটি ঠিক করা উচিত
হাও কুং

2
এটি কি মাইক্রোসফ্ট এএসপি.নেট ওয়েব অপ্টিমাইজেশন ফ্রেমওয়ার্ক 1.1.3 এ ঠিক করা আছে? এর মধ্যে কী পরিবর্তন হয়েছে সে সম্পর্কে আমি কোনও তথ্য পেয়েছি?
আন্দ্রেস

13
আইআইএস-এ আপনার কোনও ওয়েবসাইট থাকলে নতুন সিএসআরউইরাইটরাল ট্রান্সফর্ম () ঠিক আছে। তবে এটির কোনও অ্যাপ্লিকেশন বা সাব অ্যাপ্লিকেশন যদি এটি কাজ করে না, এবং আপনাকে নিজের সিএসএসের মতো একই জায়গায় আপনার বান্ডিলটি সংজ্ঞায়িত করতে হবে।
এভিডেনিক

34

Grinn / ThePirat সমাধান ভাল কাজ করে।

আমি পছন্দ করি নি যে এটি বান্ডলে অন্তর্ভুক্তকরণ পদ্ধতিটি নতুন করে চাইবে এবং এটি সামগ্রী ডিরেক্টরিতে অস্থায়ী ফাইল তৈরি করেছিল। (তারা চেক ইন করা, মোতায়েন, এবং পরিষেবা শুরু হবে না শেষ!)

তাই বান্ডিলিংয়ের নকশা অনুসরণ করতে, আমি একই কোডটি মূলত সম্পাদন করতে নির্বাচিত হয়েছি, তবে আইবান্ডল ট্রান্সফর্ম রূপায়ণে ::

class StyleRelativePathTransform
    : IBundleTransform
{
    public StyleRelativePathTransform()
    {
    }

    public void Process(BundleContext context, BundleResponse response)
    {
        response.Content = String.Empty;

        Regex pattern = new Regex(@"url\s*\(\s*([""']?)([^:)]+)\1\s*\)", RegexOptions.IgnoreCase);
        // open each of the files
        foreach (FileInfo cssFileInfo in response.Files)
        {
            if (cssFileInfo.Exists)
            {
                // apply the RegEx to the file (to change relative paths)
                string contents = File.ReadAllText(cssFileInfo.FullName);
                MatchCollection matches = pattern.Matches(contents);
                // Ignore the file if no match 
                if (matches.Count > 0)
                {
                    string cssFilePath = cssFileInfo.DirectoryName;
                    string cssVirtualPath = context.HttpContext.RelativeFromAbsolutePath(cssFilePath);
                    foreach (Match match in matches)
                    {
                        // this is a path that is relative to the CSS file
                        string relativeToCSS = match.Groups[2].Value;
                        // combine the relative path to the cssAbsolute
                        string absoluteToUrl = Path.GetFullPath(Path.Combine(cssFilePath, relativeToCSS));

                        // make this server relative
                        string serverRelativeUrl = context.HttpContext.RelativeFromAbsolutePath(absoluteToUrl);

                        string quote = match.Groups[1].Value;
                        string replace = String.Format("url({0}{1}{0})", quote, serverRelativeUrl);
                        contents = contents.Replace(match.Groups[0].Value, replace);
                    }
                }
                // copy the result into the response.
                response.Content = String.Format("{0}\r\n{1}", response.Content, contents);
            }
        }
    }
}

এবং তারপরে এটি একটি বান্ডিল বাস্তবায়নে জড়িত:

public class StyleImagePathBundle 
    : Bundle
{
    public StyleImagePathBundle(string virtualPath)
        : base(virtualPath)
    {
        base.Transforms.Add(new StyleRelativePathTransform());
        base.Transforms.Add(new CssMinify());
    }

    public StyleImagePathBundle(string virtualPath, string cdnPath)
        : base(virtualPath, cdnPath)
    {
        base.Transforms.Add(new StyleRelativePathTransform());
        base.Transforms.Add(new CssMinify());
    }
}

নমুনা ব্যবহার:

static void RegisterBundles(BundleCollection bundles)
{
...
    bundles.Add(new StyleImagePathBundle("~/bundles/Bootstrap")
            .Include(
                "~/Content/css/bootstrap.css",
                "~/Content/css/bootstrap-responsive.css",
                "~/Content/css/jquery.fancybox.css",
                "~/Content/css/style.css",
                "~/Content/css/error.css",
                "~/Content/validation.css"
            ));

আপেক্ষিক ফ্রেম অ্যাবসুলিউটপথের জন্য আমার এক্সটেনশন পদ্ধতিটি এখানে:

   public static string RelativeFromAbsolutePath(this HttpContextBase context, string path)
    {
        var request = context.Request;
        var applicationPath = request.PhysicalApplicationPath;
        var virtualDir = request.ApplicationPath;
        virtualDir = virtualDir == "/" ? virtualDir : (virtualDir + "/");
        return path.Replace(applicationPath, virtualDir).Replace(@"\", "/");
    }

এটি আমার কাছেও সবচেয়ে পরিষ্কার মনে হয়। ধন্যবাদ। আমি আপনার তিনজনকেই ভোট দিচ্ছি কারণ এটি একটি দলের প্রচেষ্টা বলে মনে হয়েছিল। :)
জোশ মাউচ

আপনার কাছে এখন কোডটি আমার পক্ষে কাজ করছে না। আমি এটি ঠিক করার চেষ্টা করছি, তবে ভেবেছিলাম আমি আপনাকে জানিয়ে দেব। প্রসঙ্গ.এইচটিটিপি কনটেক্সট. রিলেটিভফ্রম অ্যাবসুলিউটপথ পদ্ধতি বিদ্যমান নেই। এছাড়াও, যদি url পথটি একটি "/" দিয়ে শুরু হয় (এটিকে নিখুঁত করে তোলে), আপনার যুক্তির সাথে যুক্ত যুক্ত পথ বন্ধ is
জোশ মাউচ

2
@ এসিডপ্যাট দুর্দান্ত কাজ। যুক্তিতে ব্যর্থ হয়েছে যদি ইউআরএলটিতে একটি কোয়েরিস্ট্রিং থাকে (কিছু তৃতীয় পক্ষের গ্রন্থাগার এটি ফটআউবাইজের মতো এটি যুক্ত করে দেয় offউফ রেফারেন্সের জন্য)) এটি যদিও সহজ সমাধান। কেউ relativeToCSSকল করার আগে রেজেক্স সামঞ্জস্য করতে পারেন বা ঠিক করতে পারেন Path.GetFullPath()
সার্জিওপিরের

2
@ChrisMarisic আপনার কোড কাজ বলে মনে হচ্ছে না - response.Files BundleFiles একটি অ্যারে, এই বস্তুর বৈশিষ্ট্যাবলী যেমন "হইবে" না, "DirectoryName" ইত্যাদি
নিক Coad

2
@ ক্রিসমারিসিকের কি এমন কোনও নাম স্থান রয়েছে যা আমদানি করা উচিত যা বান্ডেলফাইলে শ্রেণীর জন্য এক্সটেনশন পদ্ধতিগুলি সরবরাহ করে?
নিক কোড

20

আরও ভাল (আইএমএইচও) এমন একটি কাস্টম বান্ডিল প্রয়োগ করে যা চিত্রের পাথগুলিকে ঠিক করে দেয়। আমি আমার অ্যাপের জন্য একটি লিখেছি।

using System;
using System.Collections.Generic;
using IO = System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Optimization;

...

public class StyleImagePathBundle : Bundle
{
    public StyleImagePathBundle(string virtualPath)
        : base(virtualPath, new IBundleTransform[1]
      {
        (IBundleTransform) new CssMinify()
      })
    {
    }

    public StyleImagePathBundle(string virtualPath, string cdnPath)
        : base(virtualPath, cdnPath, new IBundleTransform[1]
      {
        (IBundleTransform) new CssMinify()
      })
    {
    }

    public new Bundle Include(params string[] virtualPaths)
    {
        if (HttpContext.Current.IsDebuggingEnabled)
        {
            // Debugging. Bundling will not occur so act normal and no one gets hurt.
            base.Include(virtualPaths.ToArray());
            return this;
        }

        // In production mode so CSS will be bundled. Correct image paths.
        var bundlePaths = new List<string>();
        var svr = HttpContext.Current.Server;
        foreach (var path in virtualPaths)
        {
            var pattern = new Regex(@"url\s*\(\s*([""']?)([^:)]+)\1\s*\)", RegexOptions.IgnoreCase);
            var contents = IO.File.ReadAllText(svr.MapPath(path));
            if(!pattern.IsMatch(contents))
            {
                bundlePaths.Add(path);
                continue;
            }


            var bundlePath = (IO.Path.GetDirectoryName(path) ?? string.Empty).Replace(@"\", "/") + "/";
            var bundleUrlPath = VirtualPathUtility.ToAbsolute(bundlePath);
            var bundleFilePath = String.Format("{0}{1}.bundle{2}",
                                               bundlePath,
                                               IO.Path.GetFileNameWithoutExtension(path),
                                               IO.Path.GetExtension(path));
            contents = pattern.Replace(contents, "url($1" + bundleUrlPath + "$2$1)");
            IO.File.WriteAllText(svr.MapPath(bundleFilePath), contents);
            bundlePaths.Add(bundleFilePath);
        }
        base.Include(bundlePaths.ToArray());
        return this;
    }

}

এটি ব্যবহার করতে, করুন:

bundles.Add(new StyleImagePathBundle("~/bundles/css").Include(
  "~/This/Is/Some/Folder/Path/layout.css"));

...পরিবর্তে...

bundles.Add(new StyleBundle("~/bundles/css").Include(
  "~/This/Is/Some/Folder/Path/layout.css"));

এটি যা করে তা হ'ল (যখন ডিবাগ মোডে থাকে না) url(<something>)এটি সন্ধান করে এবং এর সাথে প্রতিস্থাপন করে url(<absolute\path\to\something>)। আমি প্রায় 10 সেকেন্ড আগে জিনিসটি লিখেছিলাম তাই এটির জন্য সামান্য টুইচিংয়ের প্রয়োজন হতে পারে। আমি ইউআরএল পথে কোনও কলোনের (:) নেই তা নিশ্চিত করে পুরো-যোগ্য URL এবং বেস 64 ডেটাউরিগুলি অ্যাকাউন্টে নিয়েছি। আমাদের পরিবেশে, চিত্রগুলি সাধারণত তাদের সিএসএস ফাইলের মতো একই ফোল্ডারে থাকে তবে আমি এটি পিতা-মাতা ফোল্ডার ( url(../someFile.png)) এবং শিশু ফোল্ডার ( url(someFolder/someFile.png) উভয়ই দিয়ে পরীক্ষা করেছি ।


এটি একটি দুর্দান্ত সমাধান। আমি আপনার রেজেক্সকে কিছুটা সংশোধন করেছি যাতে এটি কম ফাইলগুলির সাথেও কাজ করে তবে মূল ধারণাটি আমার প্রয়োজন মতো ছিল exactly ধন্যবাদ।
টিম কুল্টার

আপনি লুপের বাইরেও রেজেক্স ইনিশিয়েশন রাখতে পারেন। সম্ভবত একটি অচল পাঠযোগ্য সম্পত্তি হিসাবে।
মিহা মার্কিক

12

কোনও রূপান্তর নির্দিষ্ট করা বা ক্রেজি সাবডিরেক্টরি পাথ থাকা প্রয়োজন হয় না necessary অনেক সমস্যার সমাধানের পরে আমি এটিকে এই "সাধারণ" নিয়মে বিচ্ছিন্ন করে দিয়েছি (এটি কি বাগ?) ...

যদি আপনার বান্ডিল পথটি অন্তর্ভুক্ত আইটেমগুলির আপেক্ষিক মূলের সাথে শুরু না হয় তবে ওয়েব অ্যাপ্লিকেশন রুটটিকে বিবেচনায় নেওয়া হবে না।

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

স্পষ্ট করার জন্য, এখানে একটি উদাহরণ:

আমার এই ফাইলগুলি আছে ...

~/Content/Images/Backgrounds/Some_Background_Tile.gif
~/Content/Site.css  - references the background image relatively, i.e. background: url('Images/...')

তারপরে বান্ডিলটি সেটআপ করুন ...

BundleTable.Add(new StyleBundle("~/Bundles/Styles").Include("~/Content/Site.css"));

এবং এটি রেন্ডার করুন ...

@Styles.Render("~/Bundles/Styles")

এবং "আচরণ" (বাগ) পান, সিএসএস ফাইলগুলির নিজস্ব অ্যাপ্লিকেশন রুট রয়েছে (যেমন "http: // লোকালহস্ট: 1234 / মাইসাইট / সামগ্রী / সাইট.css") তবে সমস্ত স্টার্টের মধ্যে CSS চিত্র "/ বিষয়বস্তু / চিত্রসমূহ" / ... "বা" / চিত্র / ... "নির্ভর করে আমি রূপান্তরটি যুক্ত করব কিনা।

এমনকি "বুন্ডলস" ফোল্ডারটি তৈরির চেষ্টা করে যে এটি বিদ্যমান পাথের সাথে আছে কি না তা দেখার জন্য, কিন্তু এতে কোনও পরিবর্তন হয়নি। সমস্যার সমাধানটি সত্যই প্রয়োজন বান্ডিলটির নামটি অবশ্যই মূলের মূল দিয়ে শুরু করা উচিত।

অর্থ এই বান্ডেল পাথাকে রেজিস্টার করে এবং রেন্ডার করে এই উদাহরণটি ঠিক করা হয়েছে ..

BundleTable.Add(new StyleBundle("~/Content/StylesBundle").Include("~/Content/Site.css"));
...
@Styles.Render("~/Content/StylesBundle")

অবশ্যই আপনি বলতে পারেন এটি আরটিএফএম, তবে আমি নিশ্চিত যে আমি এবং অন্যরা ডিফল্ট টেম্পলেট থেকে বা এমএসডিএন বা এএসপি.এনইটি ওয়েব সাইটে ডকুমেন্টেশনের কোথাও এই "~ / বান্ডিলস / ..." পথটি বেছে নিয়েছি বা এটি কেবল হোঁচট খেয়েছে কারণ প্রকৃতপক্ষে এটি ভার্চুয়াল পাথের জন্য বেশ যৌক্তিক নাম এবং এই জাতীয় ভার্চুয়াল পাথগুলি বেছে নেওয়ার জন্য এটি বুদ্ধিমান এবং সত্যিকারের ডিরেক্টরিগুলির সাথে বিরোধ নয়।

যাইহোক, এটি এইভাবে। মাইক্রোসফ্ট কোনও ত্রুটি দেখতে পাচ্ছে না। আমি এটির সাথে একমত নই, হয় এটি প্রত্যাশার মতো কাজ করা উচিত বা কিছু ব্যতিক্রম ছুঁড়ে দেওয়া উচিত, বা বান্ডিল পাথ যুক্ত করার জন্য একটি অতিরিক্ত ওভাররাইড যা অ্যাপ্লিকেশন রুটকে অন্তর্ভুক্ত করে বা না পারে। আমি যখন ভাবতে পারি না যে কেন কেউ সেখানে থাকা অ্যাপ্লিকেশন রুটটি অন্তর্ভুক্ত করতে চাইবে না (সাধারণত আপনি যদি নিজের ওয়েবসাইটটি ডিএনএস উলেফ / ডিফল্ট ওয়েব রুটের সাথে ইনস্টল না করেন তবে)। সুতরাং আসলে যে কোনওভাবে ডিফল্ট হওয়া উচিত।


আমার কাছে সবচেয়ে সহজ "সমাধান" বলে মনে হচ্ছে। অন্যের পার্শ্ব প্রতিক্রিয়া থাকতে পারে, যেমন চিত্রের সাথে: ডেটা।
Fabrice

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

এই বিকল্পটি দিয়ে গেছে এবং এটি দুর্দান্ত কাজ করেছে। নিশ্চিত করতে হবে যে প্রতিটি বান্ডিলটিতে কেবলমাত্র একটি ফোল্ডার থেকে আইটেম রয়েছে (অন্য ফোল্ডার বা সাবফোল্ডারগুলির আইটেম অন্তর্ভুক্ত থাকতে পারে না) যা কিছুটা বিরক্তিকর তবে যতক্ষণ না এটি কাজ করে আমি খুশি! পোস্টের জন্য ধন্যবাদ.
hvaughan3

1
ধন্যবাদ। দীর্ঘশ্বাস. কোনও দিন আমি ব্রাউজিং স্ট্যাকের চেয়ে কোড লেখার জন্য বেশি সময় ব্যয় করতে চাই।
ব্রুস পাইয়ারসন

আমার অনুরূপ সমস্যা ছিল যেখানে একটি কাস্টম জ্যাকোয়ারি-ইউআই যা নেস্ট ফোল্ডারগুলি রেখেছিল। যত তাড়াতাড়ি আমি উপরে হিসাবে জিনিস সমতল, এটি কাজ করে। এটি নেস্টেড ফোল্ডার পছন্দ করে না।
আন্দ্রেই বাজনোভ

11

আমি দেখতে পেয়েছি যে আপনি যদি কোনও *.cssফাইল উল্লেখ করে *.min.cssথাকেন এবং একই ফোল্ডারে আপনার সাথে সম্পর্কিত ফাইল থাকে তবে CssRewriteUllTransform চালাতে ব্যর্থ ।

এটি ঠিক করতে, হয় *.min.cssফাইলটি মুছুন বা সরাসরি আপনার বান্ডেলে রেফারেন্স করুন:

bundles.Add(new Bundle("~/bundles/bootstrap")
    .Include("~/Libs/bootstrap3/css/bootstrap.min.css", new CssRewriteUrlTransform()));

এর পরে আপনি এটি করেন, আপনার ইউআরএলগুলি সঠিকভাবে রূপান্তরিত হবে এবং আপনার চিত্রগুলি সঠিকভাবে সমাধান করা উচিত।


1
ধন্যবাদ! অনলাইনে অনুসন্ধানের দু'দিন পরে, এটিই প্রথম উল্লেখ যা আমি CssRewriteUllTransfor- এর যে কোনও জায়গায় * .css ফাইলের সাথে কাজ করে দেখেছি, তবে আপনি যখন কোনও ডিবাগের সাথে চালাচ্ছেন না তখন সেই সম্পর্কিত * .min.css ফাইলের সাথে কাজ করছেন না pulled পরিবেশ। অবশ্যই আমার কাছে বাগের মতো মনে হচ্ছে। ডিবাগিংয়ের জন্য অবিস্মরণীয় সংস্করণ সহ একটি বান্ডিলটি সংজ্ঞায়িত করতে ম্যানুয়ালি পরিবেশের ধরনটি পরীক্ষা করতে হবে, তবে কমপক্ষে আমার এখন কার্যনির্বাহী কাজ রয়েছে!
শান

1
এটি আমার জন্য সমস্যাটি স্থির করেছে। এটি অবশ্যই একটি বাগের মতো মনে হচ্ছে। এটি কোনও ধারণা দেয় না যে যদি এটি একটি বিদ্যমান বিদ্যমান .min.css ফাইলটি খুঁজে পায় তবে এটি সিএসআরউইউরাইটআরল ট্রান্সফর্মটিকে উপেক্ষা করবে।
ব্যবহারকারী1751825

10

হতে পারে আমি পক্ষপাতদুষ্ট, তবে আমি আমার সমাধানটি বেশ পছন্দ করি কারণ এটি কোনও রূপান্তরকারী, রেজেক্সের ইত্যাদি করে না এবং এতে নূন্যতম পরিমাণ কোড রয়েছে :)

এটি কোনও আইআইএস ওয়েব সাইটে ভার্চুয়াল ডিরেক্টরি হিসাবে এবং আইআইএস-এর একটি রুট ওয়েবসাইট হিসাবে হোস্ট করা সাইটের জন্য কাজ করে

এর তাই আমি একটি Implentation নির্মিত IItemTransformencapsulated CssRewriteUrlTransformএবং ব্যবহৃত VirtualPathUtilityপাথ ঠিক এবং বিদ্যমান কোড কল করতে:

/// <summary>
/// Is a wrapper class over CssRewriteUrlTransform to fix url's in css files for sites on IIS within Virutal Directories
/// and sites at the Root level
/// </summary>
public class CssUrlTransformWrapper : IItemTransform
{
    private readonly CssRewriteUrlTransform _cssRewriteUrlTransform;

    public CssUrlTransformWrapper()
    {
        _cssRewriteUrlTransform = new CssRewriteUrlTransform();
    }

    public string Process(string includedVirtualPath, string input)
    {
        return _cssRewriteUrlTransform.Process("~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), input);
    }
}


//App_Start.cs
public static void Start()
{
      BundleTable.Bundles.Add(new StyleBundle("~/bundles/fontawesome")
                         .Include("~/content/font-awesome.css", new CssUrlTransformWrapper()));
}

আমার জন্য কাজ ভাল মনে হচ্ছে?


1
এটি আমার পক্ষে পুরোপুরি স্যুট। চমৎকার সমাধান। আমার ভোট +1
immadhusen

1
এটা সঠিক উত্তর. ফ্রেমওয়ার্কের সরবরাহিত CSS ব্যবহারিক ট্রান্সফর্মওয়্যার্পার ক্লাসটি সমস্যার সমাধান করে, কেবলমাত্র যখন অ্যাপ্লিকেশনটি ওয়েব সাইটে রুটে না থাকে কেবল তখনই এটি কাজ করে না। এই মোড়ক সংক্ষেপে সেই অভাবকে মোকাবেলা করে।
নাইন লেজ

7

যদিও ক্রিস বাক্সটারের উত্তরটি মূল সমস্যার সাথে সহায়তা করে, ভার্চুয়াল ডিরেক্টরিতে অ্যাপ্লিকেশনটি হোস্ট করা হলে এটি আমার ক্ষেত্রে কার্যকর হয় না । বিকল্পগুলি তদন্ত করার পরে, আমি DIY সমাধান দিয়ে শেষ করেছি।

ProperStyleBundleশ্রেণিতে CssRewriteUrlTransformভার্চুয়াল ডিরেক্টরিতে যথাযথ পাথগুলি সঠিকভাবে রূপান্তর করতে মূল থেকে ধার করা কোড অন্তর্ভুক্ত । ফাইল উপস্থিত না থাকলে এবং বান্ডলে ফাইলগুলি পুনরায় সাজানো রোধ করে (কোড থেকে নেওয়া BetterStyleBundle) এটিও ছোঁড়ে ।

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Optimization;
using System.Linq;

namespace MyNamespace
{
    public class ProperStyleBundle : StyleBundle
    {
        public override IBundleOrderer Orderer
        {
            get { return new NonOrderingBundleOrderer(); }
            set { throw new Exception( "Unable to override Non-Ordered bundler" ); }
        }

        public ProperStyleBundle( string virtualPath ) : base( virtualPath ) {}

        public ProperStyleBundle( string virtualPath, string cdnPath ) : base( virtualPath, cdnPath ) {}

        public override Bundle Include( params string[] virtualPaths )
        {
            foreach ( var virtualPath in virtualPaths ) {
                this.Include( virtualPath );
            }
            return this;
        }

        public override Bundle Include( string virtualPath, params IItemTransform[] transforms )
        {
            var realPath = System.Web.Hosting.HostingEnvironment.MapPath( virtualPath );
            if( !File.Exists( realPath ) )
            {
                throw new FileNotFoundException( "Virtual path not found: " + virtualPath );
            }
            var trans = new List<IItemTransform>( transforms ).Union( new[] { new ProperCssRewriteUrlTransform( virtualPath ) } ).ToArray();
            return base.Include( virtualPath, trans );
        }

        // This provides files in the same order as they have been added. 
        private class NonOrderingBundleOrderer : IBundleOrderer
        {
            public IEnumerable<BundleFile> OrderFiles( BundleContext context, IEnumerable<BundleFile> files )
            {
                return files;
            }
        }

        private class ProperCssRewriteUrlTransform : IItemTransform
        {
            private readonly string _basePath;

            public ProperCssRewriteUrlTransform( string basePath )
            {
                _basePath = basePath.EndsWith( "/" ) ? basePath : VirtualPathUtility.GetDirectory( basePath );
            }

            public string Process( string includedVirtualPath, string input )
            {
                if ( includedVirtualPath == null ) {
                    throw new ArgumentNullException( "includedVirtualPath" );
                }
                return ConvertUrlsToAbsolute( _basePath, input );
            }

            private static string RebaseUrlToAbsolute( string baseUrl, string url )
            {
                if ( string.IsNullOrWhiteSpace( url )
                     || string.IsNullOrWhiteSpace( baseUrl )
                     || url.StartsWith( "/", StringComparison.OrdinalIgnoreCase )
                     || url.StartsWith( "data:", StringComparison.OrdinalIgnoreCase )
                    ) {
                    return url;
                }
                if ( !baseUrl.EndsWith( "/", StringComparison.OrdinalIgnoreCase ) ) {
                    baseUrl = baseUrl + "/";
                }
                return VirtualPathUtility.ToAbsolute( baseUrl + url );
            }

            private static string ConvertUrlsToAbsolute( string baseUrl, string content )
            {
                if ( string.IsNullOrWhiteSpace( content ) ) {
                    return content;
                }
                return new Regex( "url\\(['\"]?(?<url>[^)]+?)['\"]?\\)" )
                    .Replace( content, ( match =>
                                         "url(" + RebaseUrlToAbsolute( baseUrl, match.Groups["url"].Value ) + ")" ) );
            }
        }
    }
}

এটি ব্যবহার করুন StyleBundle:

bundles.Add( new ProperStyleBundle( "~/styles/ui" )
    .Include( "~/Content/Themes/cm_default/style.css" )
    .Include( "~/Content/themes/custom-theme/jquery-ui-1.8.23.custom.css" )
    .Include( "~/Content/DataTables-1.9.4/media/css/jquery.dataTables.css" )
    .Include( "~/Content/DataTables-1.9.4/extras/TableTools/media/css/TableTools.css" ) );

2
দুর্দান্ত সমাধান, তবে তবুও ব্যর্থ হয়েছে (ঠিক তেমন সিএসআরউইরাইটরাল ট্রান্সফর্মের মতো) যদি আপনার সিএসএসে একটি ডেটা ইউআরআই থাকে (যেমন "ডেটা: চিত্র / পিএনজি; বেস64, ...")। আপনার ইউআরএলটির শুরুটি "ডেটা:" দিয়ে রেবেসআরলটোঅবসুলিউট () এ পরিবর্তন করা উচিত নয়।
মাইলস 82

1
@ মাইল 82 অবশ্যই! এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ. আমি রেবেসআরলটিওঅবসুলিউট () পরিবর্তন করেছি।
নরোডিক

6

V1.1.0-alpha1 (প্রাক রিলিজ প্যাকেজ) হিসাবে ফ্রেমওয়ার্কটি VirtualPathProviderফিজিক্যাল ফাইল সিস্টেমে স্পর্শ না করে ফাইল অ্যাক্সেস করতে ব্যবহার করে ।

আপডেট হওয়া ট্রান্সফর্মারটি নীচে দেখা যাবে:

public class StyleRelativePathTransform
    : IBundleTransform
{
    public void Process(BundleContext context, BundleResponse response)
    {
        Regex pattern = new Regex(@"url\s*\(\s*([""']?)([^:)]+)\1\s*\)", RegexOptions.IgnoreCase);

        response.Content = string.Empty;

        // open each of the files
        foreach (var file in response.Files)
        {
            using (var reader = new StreamReader(file.Open()))
            {
                var contents = reader.ReadToEnd();

                // apply the RegEx to the file (to change relative paths)
                var matches = pattern.Matches(contents);

                if (matches.Count > 0)
                {
                    var directoryPath = VirtualPathUtility.GetDirectory(file.VirtualPath);

                    foreach (Match match in matches)
                    {
                        // this is a path that is relative to the CSS file
                        var imageRelativePath = match.Groups[2].Value;

                        // get the image virtual path
                        var imageVirtualPath = VirtualPathUtility.Combine(directoryPath, imageRelativePath);

                        // convert the image virtual path to absolute
                        var quote = match.Groups[1].Value;
                        var replace = String.Format("url({0}{1}{0})", quote, VirtualPathUtility.ToAbsolute(imageVirtualPath));
                        contents = contents.Replace(match.Groups[0].Value, replace);
                    }

                }
                // copy the result into the response.
                response.Content = String.Format("{0}\r\n{1}", response.Content, contents);
            }
        }
    }
}

প্রকৃতপক্ষে, সিএসএসে আপেক্ষিক URL গুলি পরম দ্বারা প্রতিস্থাপন করা হলে এটি কী করে।
ফ্যাব্রিস

6

এখানে এমন একটি বান্ডিল ট্রান্সফর্ম যা সিএসএস ইউআরএলগুলিকে সেই সিএসএস ফাইলের সাথে সম্পর্কিত url এর সাথে প্রতিস্থাপন করবে। এটি কেবল আপনার বান্ডেলে যুক্ত করুন এবং এটি সমস্যার সমাধান করা উচিত।

public class CssUrlTransform: IBundleTransform
{
    public void Process(BundleContext context, BundleResponse response) {
        Regex exp = new Regex(@"url\([^\)]+\)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
        foreach (FileInfo css in response.Files) {
            string cssAppRelativePath = css.FullName.Replace(context.HttpContext.Request.PhysicalApplicationPath, context.HttpContext.Request.ApplicationPath).Replace(Path.DirectorySeparatorChar, '/');
            string cssDir = cssAppRelativePath.Substring(0, cssAppRelativePath.LastIndexOf('/'));
            response.Content = exp.Replace(response.Content, m => TransformUrl(m, cssDir));
        }
    }


    private string TransformUrl(Match match, string cssDir) {
        string url = match.Value.Substring(4, match.Length - 5).Trim('\'', '"');

        if (url.StartsWith("http://") || url.StartsWith("data:image")) return match.Value;

        if (!url.StartsWith("/"))
            url = string.Format("{0}/{1}", cssDir, url);

        return string.Format("url({0})", url);
    }

}

এটি কীভাবে ব্যবহার করবেন ?, এটি আমাকে একটি ব্যতিক্রম দেখায়:cannot convert type from BundleFile to FileInfo
উত্তেজিত করুন

@Stiger পরিবর্তন css.FullName.Replace (css.VirtualFile.VirtualPath.Replace করার জন্য (
lkurylo

আমি সম্ভবত এটি ভুল ব্যবহার করছি, তবে কি সেই পূর্বাচণাগুলি প্রতিটি পুনরাবৃত্তির সমস্ত ইউআরএলগুলি পুনরায় লিখন করে এবং এটি দেখেছিল সর্বশেষ CSS ফাইলের তুলনায় এগুলি ছেড়ে দেয়?
Andyrooger

4

অন্য বিকল্পটি হ'ল আইআইএল ইউআরএল পুনর্লিখনের মডিউলটি ব্যবহার করে প্রকৃত চিত্র ফোল্ডারে ভার্চুয়াল বান্ডিল চিত্র ফোল্ডারটি মানচিত্র করতে পারেন। নীচে পুনর্লিখনের নিয়মের একটি উদাহরণ রয়েছে যা থেকে আপনি "bu / বান্ডেল / আপনার পৃষ্ঠা / শৈলী" নামে একটি বান্ডিলের জন্য ব্যবহার করতে পারেন - আলফানিউমেরিক অক্ষরের পাশাপাশি হাইফেন, আন্ডারস্কোর এবং পিরিয়ডগুলির সাথে রেজেক্স ম্যাচগুলি নোট করুন, যা চিত্র ফাইলের নামগুলিতে সাধারণ ।

<rewrite>
  <rules>
    <rule name="Bundle Images">
      <match url="^bundles/yourpage/images/([a-zA-Z0-9\-_.]+)" />
      <action type="Rewrite" url="Content/css/jquery-ui/images/{R:1}" />
    </rule>
  </rules>
</rewrite>

এই পদ্ধতির ফলে কিছুটা অতিরিক্ত ওভারহেড তৈরি করা যায় তবে এটি আপনাকে আপনার বান্ডিলের নামগুলিতে আরও নিয়ন্ত্রণ রাখতে দেয় এবং আপনাকে একটি পৃষ্ঠায় উল্লেখ করতে পারে এমন বান্ডিলের সংখ্যাও হ্রাস করে। অবশ্যই, যদি আপনাকে একাধিক তৃতীয় পক্ষের সিএসএস ফাইলগুলি উল্লেখ করতে হয় যা আপেক্ষিক চিত্রের রেফারেন্স ধারণ করে, আপনি এখনও একাধিক বান্ডিল তৈরি করতে পারেন না around


4

Grinn সমাধান দুর্দান্ত।

তবে যখন url এ প্যারেন্ট ফোল্ডারে আপেক্ষিক উল্লেখ থাকে তখন এটি আমার পক্ষে কার্যকর হয় না। অর্থাতurl('../../images/car.png')

সুতরাং, Includeপ্রতিটি রেইগেক্স ম্যাচের জন্য পাথগুলি সমাধান করার জন্য আমি সামান্য পদ্ধতিটি পরিবর্তিত করেছি , আপেক্ষিক পাথগুলিকে অনুমতি দিয়েছি এবং সিএসএসে চিত্রগুলি optionচ্ছিকভাবে এম্বেড করার জন্য।

আমি BundleTable.EnableOptimizationsপরিবর্তে IF DEBUG চেক করতে HttpContext.Current.IsDebuggingEnabled

    public new Bundle Include(params string[] virtualPaths)
    {
        if (!BundleTable.EnableOptimizations)
        {
            // Debugging. Bundling will not occur so act normal and no one gets hurt. 
            base.Include(virtualPaths.ToArray());
            return this;
        }
        var bundlePaths = new List<string>();
        var server = HttpContext.Current.Server;
        var pattern = new Regex(@"url\s*\(\s*([""']?)([^:)]+)\1\s*\)", RegexOptions.IgnoreCase);
        foreach (var path in virtualPaths)
        {
            var contents = File.ReadAllText(server.MapPath(path));
            var matches = pattern.Matches(contents);
            // Ignore the file if no matches
            if (matches.Count == 0)
            {
                bundlePaths.Add(path);
                continue;
            }
            var bundlePath = (System.IO.Path.GetDirectoryName(path) ?? string.Empty).Replace(@"\", "/") + "/";
            var bundleUrlPath = VirtualPathUtility.ToAbsolute(bundlePath);
            var bundleFilePath = string.Format("{0}{1}.bundle{2}",
                                               bundlePath,
                                               System.IO.Path.GetFileNameWithoutExtension(path),
                                               System.IO.Path.GetExtension(path));
            // Transform the url (works with relative path to parent folder "../")
            contents = pattern.Replace(contents, m =>
            {
                var relativeUrl = m.Groups[2].Value;
                var urlReplace = GetUrlReplace(bundleUrlPath, relativeUrl, server);
                return string.Format("url({0}{1}{0})", m.Groups[1].Value, urlReplace);
            });
            File.WriteAllText(server.MapPath(bundleFilePath), contents);
            bundlePaths.Add(bundleFilePath);
        }
        base.Include(bundlePaths.ToArray());
        return this;
    }


    private string GetUrlReplace(string bundleUrlPath, string relativeUrl, HttpServerUtility server)
    {
        // Return the absolute uri
        Uri baseUri = new Uri("http://dummy.org");
        var absoluteUrl = new Uri(new Uri(baseUri, bundleUrlPath), relativeUrl).AbsolutePath;
        var localPath = server.MapPath(absoluteUrl);
        if (IsEmbedEnabled && File.Exists(localPath))
        {
            var fi = new FileInfo(localPath);
            if (fi.Length < 0x4000)
            {
                // Embed the image in uri
                string contentType = GetContentType(fi.Extension);
                if (null != contentType)
                {
                    var base64 = Convert.ToBase64String(File.ReadAllBytes(localPath));
                    // Return the serialized image
                    return string.Format("data:{0};base64,{1}", contentType, base64);
                }
            }
        }
        // Return the absolute uri 
        return absoluteUrl;
    }

আশা করি, এটি সাহায্য করে।


2

আপনি সহজেই আপনার ভার্চুয়াল বান্ডিল পথে আরও গভীরতার স্তর যোগ করতে পারেন

    //Two levels deep bundle path so that paths are maintained after minification
    bundles.Add(new StyleBundle("~/Content/css/css").Include("~/Content/bootstrap/bootstrap.css", "~/Content/site.css"));

এটি একটি দুর্দান্ত লো-প্রযুক্তি উত্তর এবং হ্যাক জাতীয় ধরণের তবে এটি কাজ করে এবং কোনও প্রাক প্রক্রিয়াজাতকরণের প্রয়োজন হবে না। এই উত্তরগুলির কয়েকটি দৈর্ঘ্য এবং জটিলতা দেওয়া আমি এইভাবে এটি করা পছন্দ করি।


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

আইআইএস-এ অ্যাপ্লিকেশনটি ভার্চুয়াল অ্যাপ্লিকেশন করার সময় আমার একই সমস্যা ছিল। এই উত্তরটি আমাকে সাহায্য করে।
বিল

2

ইমেজগুলির কাছে ভুল পাথের বান্ডিল থাকা এবং CssRewriteUrlTransformআপেক্ষিক পিতামাতার পথগুলি ..সঠিকভাবে সমাধান না করার সাথে আমার সমস্যা ছিল (ওয়েবফন্টের মতো বাহ্যিক সংস্থানগুলির ক্ষেত্রেও সমস্যা ছিল)। এই কারণেই আমি এই কাস্টম রূপান্তরটি লিখেছি (উপরের সমস্তটি সঠিকভাবে করা সম্ভব হবে):

public class CssRewriteUrlTransform2 : IItemTransform
{
    public string Process(string includedVirtualPath, string input)
    {
        var pathParts = includedVirtualPath.Replace("~/", "/").Split('/');
        pathParts = pathParts.Take(pathParts.Count() - 1).ToArray();
        return Regex.Replace
        (
            input,
            @"(url\(['""]?)((?:\/??\.\.)*)(.*?)(['""]?\))",
            m => 
            {
                // Somehow assigning this to a variable is faster than directly returning the output
                var output =
                (
                    // Check if it's an aboslute url or base64
                    m.Groups[3].Value.IndexOf(':') == -1 ?
                    (
                        m.Groups[1].Value +
                        (
                            (
                                (
                                    m.Groups[2].Value.Length > 0 ||
                                    !m.Groups[3].Value.StartsWith('/')
                                )
                            ) ?
                            string.Join("/", pathParts.Take(pathParts.Count() - m.Groups[2].Value.Count(".."))) :
                            ""
                        ) +
                        (!m.Groups[3].Value.StartsWith('/') ? "/" + m.Groups[3].Value : m.Groups[3].Value) +
                        m.Groups[4].Value
                    ) :
                    m.Groups[0].Value
                );
                return output;
            }
        );
    }
}

সম্পাদনা: আমি এটি বুঝতে পারি নি, তবে আমি কোডটিতে কিছু কাস্টম এক্সটেনশন পদ্ধতি ব্যবহার করেছি। এগুলির উত্স কোডটি হ'ল:

/// <summary>
/// Based on: http://stackoverflow.com/a/11773674
/// </summary>
public static int Count(this string source, string substring)
{
    int count = 0, n = 0;

    while ((n = source.IndexOf(substring, n, StringComparison.InvariantCulture)) != -1)
    {
        n += substring.Length;
        ++count;
    }
    return count;
}

public static bool StartsWith(this string source, char value)
{
    if (source.Length == 0)
    {
        return false;
    }
    return source[0] == value;
}

অবশ্যই এটি String.StartsWith(char)সঙ্গে প্রতিস্থাপন করা উচিত String.StartsWith(string)


আমি একটি String.Count () জমিদার যে একটি স্ট্রিং গ্রহণ (না m.Groups[2].Value.Count("..")কাজ করে না।) এবং Value.StartsWith('/')কারণ StartsWith একটি গৃহস্থালি পরিবর্তে একটি স্ট্রিং আশা পারেন কাজ করে না।
জাও

@ জাও আমার খারাপ আমি কোডটিতে আমার নিজের এক্সটেনশন পদ্ধতিগুলি অনুধাবন না করে অন্তর্ভুক্ত করেছি।
jahu

1
@ জাজো উত্তরে সেই সম্প্রসারণ পদ্ধতির উত্স কোড যুক্ত করেছে।
জাহু

1

সামান্য তদন্তের পরে আমি নিম্নলিখিতগুলি শেষ করলাম: আপনার কাছে 2 টি বিকল্প রয়েছে:

  1. রূপান্তর সঙ্গে যান। এর জন্য খুব দরকারী প্যাকেজ: https://bundletransformer.codeplex.com/ আপনার প্রতিটি সমস্যাযুক্ত বান্ডেলের জন্য নিম্নলিখিত রূপান্তর প্রয়োজন:

    BundleResolver.Current = new CustomBundleResolver();
    var cssTransformer = new StyleTransformer();
    standardCssBundle.Transforms.Add(cssTransformer);
    bundles.Add(standardCssBundle);

সুবিধাগুলি: এই সমাধানটির জন্য, আপনি নিজের বান্ডিলটির নাম যা খুশি করতে পারেন => আপনি সিএসএস ফাইলগুলিকে বিভিন্ন ডিরেক্টরি থেকে একটি বান্ডেলে একত্রিত করতে পারেন। অসুবিধাগুলি: আপনার প্রতিটি সমস্যাযুক্ত বান্ডিল রূপান্তর করতে হবে

  1. সিএসএস ফাইলটি যেখানে অবস্থিত যেমন বান্ডিলের নামের জন্য একই আপেক্ষিক মূল ব্যবহার করুন। সুবিধা: রূপান্তরের দরকার নেই। অসুবিধাগুলি: বিভিন্ন ডিরেক্টরি থেকে সিএসএস শীটকে একটি বান্ডলে সংমিশ্রণ করার ক্ষেত্রে আপনার সীমাবদ্ধতা রয়েছে।

0

CssRewriteUrlTransformআমার সমস্যা সমাধান।
যদি আপনার কোড ব্যবহারের পরেও চিত্রগুলি লোড না করে CssRewriteUrlTransform, তবে আপনার সিএসএস ফাইলের নামগুলি এ থেকে পরিবর্তন করুন:

.Include("~/Content/jquery/jquery-ui-1.10.3.custom.css", new CssRewriteUrlTransform())

প্রতি:

.Include("~/Content/jquery/jquery-ui.css", new CssRewriteUrlTransform())

যাইহোক। (বিন্দুগুলি) url- এ স্বীকৃতি দিচ্ছে না।


0

কেবল একটি বান্ডলে একাধিক সিএসএস অন্তর্ভুক্তি ঠিক করতে মনে রাখবেন :

bundles.Add(new StyleBundle("~/Content/styles/jquery-ui")
    .Include("~/Content/css/path1/somestyle1.css", "~/Content/css/path2/somestyle2.css"));

আপনি কেবল new CssRewriteUrlTransform()একটি সিএসএস ফাইল দিয়ে শেষের দিকে যুক্ত করতে পারবেন না কারণ পদ্ধতিটি সমর্থন করে না, তাই আপনাকে একাধিকবার ব্যবহারInclude করতে হবে :

bundles.Add(new StyleBundle("~/Content/styles/jquery-ui")
    .Include("~/Content/css/path1/somestyle1.css", new CssRewriteUrlTransform())
    .Include("~/Content/css/path2/somestyle2.css", new CssRewriteUrlTransform()));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.