SORU
21 AĞUSTOS 2008, PERŞEMBE


ASP.NET MVC ayrı kurullarda görüşlerini

Eklenti ayrı meclisleri olmak istediğim yere bir webapplication oluşturmak için çalışıyorum. Eklenti benim derlemeler denetleyicileri oluşturmak için kullanılacak olan bağımlılık enjeksiyon için Birlik ile birlikte MVC preview 4 kullanıyorum. Görünüm motorum olarak WebForms (varsayılan SEO) kullanıyorum.

Eğer bir görünüm kullanmak istiyorsanız, SEO kısmı dinamik derleme çünkü temel proje olarak tanımlanan, olanları yolda kaldım. Uygun bir şekilde bütün dağıtım adım gitmek zorunda kalmadan, farklı bir derleme SEO dosyalarını alın, arıyorum. Eksik bir şey belli mi? Ya da benim görüş oluşturmak için resort Program aracılığıyla gerekir?

< / ^ hr .

Güncelleme: kabul cevabı değiştirdim. Dale cevabı çok kapsamlı olsa da, farklı sanal yol sağlayıcısı ile çözüm için gittim. Bir cazibe gibi çalışır, ve bence tamamen kod 20 satır alır.

CEVAP
1 Ocak 2011, CUMARTESİ


Aldı beni yol çok uzun olsun bu çalışma doğru gelen çeşitli kısmi numuneye işte tam kod gerekli almak görünümleri bir Görüş klasöründe bir paylaşımlı kütüphane yapısal olarak bir normal Görünümleri klasörü ama birlikte her şeyi ayarlamak için inşa olarak gömülü kaynakları. Sadece her zamanki dosya varsa gömülü dosyayı kullanır.

Application_Start ilk satır:

HostingEnvironment.RegisterVirtualPathProvider(new EmbeddedViewPathProvider());

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

    }

}

Çalışan almak için son adım kök Web.Config görünümler klasöründe bir kullanılmayacağı gibi ayarları kesinlikle yazılmış MVC manzarası ayrıştırmak için içermesi gerekir:

<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>

Ek adımlar bir çift Mono ile çalışan almak için gereklidir. İlk görünümler bir klasördeki tüm dosyalar uygulaması gerektiği gibi yerine başlatıldığında yüklenir olduğundan GetDirectory uygulamak gerekir

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

Son olarak, kesinlikle yazılmış görüş neredeyse ama oldukça mükemmel çalışacaktır. Model yazılmamış bir nesne olarak kabul edilir, güçlü yazarak geri almak için bir şey ile paylaşılan görüşlerin gibi başlamak gerekir

<% var Model2 = Model as IEnumerable<AppModel>;  %>

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • knopik96

    knopik96

    7 Mayıs 2011
  • RFS Dan

    RFS Dan

    22 Temmuz 2014
  • Warner Bros. UK

    Warner Bros.

    6 HAZİRAN 2008