سؤال

في العادي WebForms السيناريو ، أي الجذر-عناوين url النسبية (مثلا ، ~/folder/file.txt) داخل ملفات CSS مثل:

.form { background-image: url(~/Content/Images/form_bg.gif); }

سوف تحصل تلقائيا على حلها أثناء وقت التشغيل إذا كنت تحديد

<head runat="server">

في الرجوع إلى الصفحة.

بيد أن ذلك لم يعد يحدث على ASP.NET MVC Beta1 الموقع.

هل هناك طريقة يمكنني تمكين هذه الوظيفة دون اللجوء إلى الخارقة أو CSS-محمل الملف ؟ ربما HttpModules أو ما شابه ؟

أو أنا لا desigining موقع الويب الخاص بي بشكل صحيح ؟ ما هو من المفترض أن يكون التصميم الجيد ؟

منذ الأصلية ASP.NET WebForms بالفعل هذه الميزة ، أنا أفضل أن استخدام أي وظيفة إذا كان ذلك ممكنا.ولكن ليس لدي فكرة.

هذا التطبيق على شبكة الإنترنت سيتم نشرها في عدة بيئات حيث ~ المجلد الجذر قد لا تكون واضحة.


تحرير: أعني url في محتويات الملف وليس الملف url نفسه.

هل كانت مفيدة؟

المحلول

وأنا لن يكلف نفسه عناء مع auto-root-العثور على ~ حرف.أنا أفهم أن كنت تريد نفس الحل إلى العمل حيث الدليل الجذر يختلف بين عمليات النشر ، ولكن ضمن CSS الوثيقة يجب أن لا يكون لديك أي مشاكل في استخدام المسارات النسبية.مسارات في CSS الوثيقة (إلى عنوان URL للصورة في المثال الخاص بك) سوف تكون دائما نسبة إلى موقع ملف CSS بغض النظر عن مسار أي صفحة بتحميل هذا الملف المغلق.حتى إذا كانت الصور في ~/Content/Images و صفحات الأنماط الخاصة بك في ~/Content/Stylesheets, سوف تكون دائما قادرة على استخدام background-image: url(../Images/form_bg.gif); وأنها ستعمل بغض النظر عن موقع الصفحة التي الأحمال الأنماط.

هل هناك سبب هذه لن تعمل ؟

نصائح أخرى

خدعة واحدة كنت قد استخدمت في الماضي, كان في الواقع جعل ملف CSS لديك .ASPX التمديد ، وتعيين الخاصية ContentType في صفحة التوقيع:

<%@ Page Language="C#" ContentType="text/css" %>

body {
    margin: 0;
    padding: 0;
    background: #C32605 url(<%= ResolveUrl("~/Content/themes/base/images/BodyBackground.png") %>) repeat-x;
    font-family: Verdana, Arial, sans-serif;
    font-size: small;
    color: #d7f9ff;
}

وهذا يضمن أن ملف CSS يذهب من خلال ASP.NET إطار يستبدل برمجية من جانب الخادم الخاص بك مع مسار نسبي.

هنا هي بعض الموارد على تنفيذ IHttpModule لاعتراض طلبات الويب إلى التطبيق الخاص بك...

كتابة/تكييف واحد إلى التحقق من نوع الملف (على سبيل المثالشبة الكود:إذا (طلب ينتهي ".css") ...)

ثم استخدام تعبير عادي استبدال كافة مثيلات "~/" مع النظام.ويب.VirtualPathUtility.ToAbsolute("~/")

أنا لا أعرف ماذا سيفعل هذا الأداء تشغيل كل طلب من خلال هذا النوع من مرشح ، ولكن ربما يمكنك عزف مع الويب الخاص بك.config و/أو MVC URL الطرق المؤدية إلى قمع كل شيء .css الطلبات من خلال هذا النوع من مرشح في حين تخطي الماضي عن الملفات الأخرى.

تعال إلى التفكير في الأمر, ربما يمكنك تحقيق نفس التأثير داخل ASP.NET MVC التطبيق خلال توجيه كل ما تبذلونه من CSS refrences في وحدة تحكم خاصة.العمل الذي يقوم بإجراء هذا النوع من تجهيزها بالنسبة لك.أشك في أن يكون performant كما IHttpModule على الرغم من.

إذا كنت تحاول تحليل ~/ من أي ملف ، بما في ذلك الملفات النصية, جافا سكريبت, إلخ, يمكنك كتابة معالج يعين فلتر و يمكنك استخدام هذا البحث عن هذه المسارات...على سبيل المثال...

public class StringParsingFilter : MemoryStream {

    public Stream OriginalStream {
        get { return this.m_OriginalStream; }
        set { this.m_OriginalStream = value; }
    }
    private System.IO.Stream m_OriginalStream;

    public StringParsingFilter() : base() {
        this.m_OriginalStream = null;
    }

    public override void Flush() {
        this.m_OriginalStream.Flush();
    }

    public override void Write(byte[] buffer, int offset, int count) {

        //otherwise, parse for the correct content
        string value = System.Text.Encoding.Default.GetString(buffer);
        string contentType = HttpContext.Current.Response.ContentType;

        //Do any parsing here
        ...

        //write the new bytes to the stream
        byte[] bytes = System.Text.Encoding.Default.GetBytes(value);
        this.m_OriginalStream.Write(bytes, offset, count + (bytes.Length - buffer.Length));

    }

}

وعليك كتابة معالج مخصص لمعرفة متى يتم تعيين هذا المرشح...مثل ما يلي...

 public class FilterControlModule : IHttpModule {

    public void Init(HttpApplication context) {
        HttpApplication oAppContext = context;
        oAppContext.BeginRequest += new EventHandler(_HandleSettingFilter);                        
    }

    private void _HandleSettingFilter(object sender, EventArgs e) {

        //You might check the file at this part to make sure
        //it is a file type you want to parse
        //if (!CurrentFile.isStyleSheet()) { return; }
        ...

        //assign the new filter
        StringParsingFilter filter = new StringParsingFilter();
        filter.OriginalStream = HttpContext.Current.Response.Filter;
        HttpContext.Current.Response.Filter = (Stream)filter;

    }

}

فإنه قد يكون في الواقع من السهل عليك أن تقول "ابحث IHttpModules" لكن هذه بعض التعليمات البرمجية التي كنت تستخدم لتحليل الملفات على المسارات الأخرى من ASP.net ملفات.

سيكون لديك أيضا إلى تغيير بعض الأشياء في إعدادات IIS للسماح الملفات التي يتم تحليلها من خلال وضع ASP.net ISAPI أن يكون البدل لجميع من الملفات التي تحصل على التعامل معها.يمكنك ان ترى المزيد في هذا الموقع, إذا كنت تستخدم IIS6 هذا...

يمكنك أيضا استخدام هذا تعديل أي أنواع الملفات حتى يمكن تعيين بعض الفلاتر على الصور, بعض جافا سكريبت أو الأنماط أو ...حقا أي شيء...

يمكنك استخدام URL مصحح لإصلاح URL كما يأتي الطلب ، على الرغم من أنني لست متأكدا من ذلك بكثير أنيقة كما هاك في هذه الحالة.

أنا خلقت PathHelper util فئة يعطيني جميع مسارات أريد.على سبيل المثال

<link href="<%=PathHelper.CssUrl("FormulaIndex.css")%>" rel="Stylesheet" type="text/css"/>

يعطيني الصحيح url الكامل مع مساعدة من نظام.ويب.VirtualPathUtility.ToAbsolute() و بلدي الاتفاقية (المحتوى/css/yourFile.css).

فعلت الشيء نفسه بالنسبة js, xml, t9n, صور...المركزي لإعادة الاستخدام الآن أنا فقط اضطر إلى تغيير سطر واحد للقبض على الانتقال من مجلد البرامج النصية من المحتوى/js إلى البرامج النصية في كل المواقع و الصفحات.

مغفل تحرك إذا كنت تسألني, لكنه الواقع الحالي بيتا :(

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top