سؤال

أحاول إنشاء webapplication حيث كنت تريد أن تكون قادرة على المكونات منفصلة في الجمعيات.أنا باستخدام MVC معاينة 4 جنبا إلى جنب مع الوحدة من أجل حقن التبعية التي يمكنني استخدامها لإنشاء وحدات التحكم من بلدي المساعد الجمعيات.أنا باستخدام WebForms (default aspx) كما رأيي المحرك.

إذا كنت ترغب في استخدام طريقة عرض ، أنا عالقة على تلك التي تم تعريفها في جوهر المشروع ، بسبب ديناميكية تجميع ASPX جزء.أنا أبحث عن الطريقة السليمة أرفق ملفات ASPX في مختلف الجمعية ، دون الحاجة إلى الذهاب من خلال كل نشر الخطوة.أنا في عداد المفقودين شيء واضح ؟ أو يجب أن تلجأ إلى خلق وجهات نظري برمجيا ؟


تحديث:لقد غيرت الجواب المقبول.على الرغم من دايل الجواب دقيق جدا ، ذهبت الحل مع مختلف المسار الظاهري مزود.وهي تعمل مثل سحر و يأخذ فقط حوالي 20 خطوط في التعليمات البرمجية تماما على ما أعتقد.

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

المحلول

أساسا هذا هو نفس الموضوع كما كان الناس مع WebForms و محاولة ترجمة UserControl ASCX ملفات DLL.لقد وجدت هذا http://www.codeproject.com/KB/aspnet/ASP2UserControlLibrary.aspx قد يفيدك أيضا.

نصائح أخرى

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

السطر الأول من Application_Start:

HostingEnvironment.RegisterVirtualPathProvider(new EmbeddedViewPathProvider());

على VirtualPathProvider

   public class EmbeddedVirtualFile : VirtualFile
{
    public EmbeddedVirtualFile(string virtualPath)
        : base(virtualPath)
    {
    }

    internal static string GetResourceName(string virtualPath)
    {
        if (!virtualPath.Contains("/Views/"))
        {
            return null;
        }



        var resourcename = virtualPath
            .Substring(virtualPath.IndexOf("Views/"))
            .Replace("Views/", "OrangeGuava.Common.Views.")
            .Replace("/", ".");

        return resourcename;

    }


    public override Stream Open()
    {
        Assembly assembly = Assembly.GetExecutingAssembly();


        var resourcename = GetResourceName(this.VirtualPath);
        return assembly.GetManifestResourceStream(resourcename);
    }




}

public class EmbeddedViewPathProvider : VirtualPathProvider
{


    private bool ResourceFileExists(string virtualPath)
    {

        Assembly assembly = Assembly.GetExecutingAssembly();


        var resourcename = EmbeddedVirtualFile.GetResourceName(virtualPath);
        var result = resourcename != null && assembly.GetManifestResourceNames().Contains(resourcename);
        return result;
    }

    public override bool FileExists(string virtualPath)
    {
        return base.FileExists(virtualPath) || ResourceFileExists(virtualPath);
    }


    public override VirtualFile GetFile(string virtualPath)
    {

        if (!base.FileExists(virtualPath))
        {
            return new EmbeddedVirtualFile(virtualPath);
        }
        else
        {
            return base.GetFile(virtualPath);
        }

    }

}

الخطوة النهائية للحصول على عمل هو أن "موقع ويب الجذر".التكوين يجب أن يحتوي على الإعدادات الصحيحة لتحليل بقوة كتبته MVC وجهات النظر في آراء المجلد لن يتم استخدام:

<pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <controls>
    <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>

بضع خطوات إضافية مطلوبة للحصول على عمل مع أحادية.أولا, تحتاج إلى تنفيذ GetDirectory ، حيث أن جميع الملفات في مجلد المشاهدات الحصول على تحميل عندما يبدأ التطبيق بدلا من حسب الحاجة:

public override VirtualDirectory GetDirectory(string virtualDir)
    {
        Log.LogInfo("GetDirectory - " + virtualDir);
        var b = base.GetDirectory(virtualDir);
        return new EmbeddedVirtualDirectory(virtualDir, b);
    }

public class EmbeddedVirtualDirectory : VirtualDirectory
{
    private VirtualDirectory FileDir { get; set; } 

    public EmbeddedVirtualDirectory(string virtualPath, VirtualDirectory filedir)
        : base(virtualPath)
    {
        FileDir = filedir;
    }

    public override System.Collections.IEnumerable Children
    {
        get { return FileDir.Children; }
    }

    public override System.Collections.IEnumerable Directories
    {
        get { return FileDir.Directories; }
    }

    public override System.Collections.IEnumerable Files
    {
        get {

            if (!VirtualPath.Contains("/Views/") || VirtualPath.EndsWith("/Views/"))
            {
                return FileDir.Files;
            }

            var fl = new List<VirtualFile>();

            foreach (VirtualFile f in FileDir.Files)
            {
                fl.Add(f);
            }


            var resourcename = VirtualPath.Substring(VirtualPath.IndexOf("Views/"))
.Replace("Views/", "OrangeGuava.Common.Views.")
.Replace("/", ".");

            Assembly assembly = Assembly.GetExecutingAssembly();

            var rfl = assembly.GetManifestResourceNames()
                .Where(s => s.StartsWith(resourcename))
                .Select(s => VirtualPath + s.Replace(resourcename, ""))
                .Select(s => new EmbeddedVirtualFile(s));
            fl.AddRange(rfl);

            return fl;
        }
    }
}

أخيرا بقوة كتبته الآراء تقريبا ولكن ليس تماما العمل تماما.وسوف يكون نموذج يعامل مصنف كائن ، لذلك على الكتابة قوية مرة أخرى عليك أن تبدأ الخاص بك الآراء المشتركة مع شيء من هذا القبيل

<% var Model2 = Model as IEnumerable<AppModel>;  %>
protected void Application_Start()
{
    WebFormViewEngine engine = new WebFormViewEngine();

    engine.ViewLocationFormats = new[] { "~/bin/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx" };
    engine.PartialViewLocationFormats = engine.ViewLocationFormats;

    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(engine);

    RegisterRoutes(RouteTable.Routes);
}

تعيين 'نسخ إلى إخراج العقار من أجل 'نسخ دائما'

إضافة إلى كل الذين ما زالوا يبحثون عن الكأس المقدسة:لقد جئت قليلا أقرب إلى العثور على ذلك ، إذا أنت لا تعلق على webforms viewengine.

لقد حاولت مؤخرا من شرارة viewengine.عدا كونها ممتاز تماما و لن أعود إلى webforms حتى لو كنت threathened ، كما يوفر بعض لطيفة جدا السنانير نمطية من تطبيق.على سبيل المثال في مستندات باستخدام وندسور كما الحاويات اللجنة الاولمبية الدولية ، ولكن لا أستطيع أن أتخيل أن يكون هناك الكثير أكثر صعوبة إذا كنت تريد أن تأخذ نهجا آخر.

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