第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ASP.NET MVC中單獨程序集中的視圖

ASP.NET MVC中單獨程序集中的視圖

偶然的你 2019-10-08 10:56:16
我正在嘗試創(chuàng)建一個Web應用程序,希望能夠在其中插入單獨的程序集。我將MVC Preview 4與Unity結(jié)合使用進行依賴項注入,我使用它從插件程序集創(chuàng)建控制器。我正在使用WebForms(默認aspx)作為視圖引擎。如果要使用視圖,則由于ASPX部件的動態(tài)編譯,我將停留在核心項目中定義的視圖上。我正在尋找一種將ASPX文件封裝在不同程序集中的正確方法,而不必執(zhí)行整個部署步驟。我是否缺少明顯的東西?還是我應該以編程方式創(chuàng)建視圖?更新:我更改了接受的答案。即使Dale的答案很徹底,我還是選擇了其他虛擬路徑提供程序來尋求解決方案。我覺得它像一個咒語一樣工作,只占用大約20行代碼。
查看完整描述

3 回答

?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

我花了很長時間才能從各個部分樣本中正常工作,所以這里是從共享庫中的Views文件夾獲取視圖所需的全部代碼,該庫與常規(guī)Views文件夾的結(jié)構(gòu)相同,但所有內(nèi)容都設(shè)置為嵌入式構(gòu)建資源。如果普通文件不存在,它將僅使用嵌入式文件。


Application_Start的第一行:


HostingEnvironment.RegisterVirtualPathProvider(new EmbeddedViewPathProvider());

虛擬路徑提供者


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

        }


    }


}

使它工作的最后一步是,根Web.Config必須包含正確的設(shè)置才能解析強類型的MVC視圖,因為不會使用views文件夾中的視圖:


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

要使其與Mono一起使用,還需要執(zhí)行幾個附加步驟。首先,您需要實現(xiàn)GetDirectory,因為views文件夾中的所有文件都是在應用啟動時加載的,而不是根據(jù)需要加載的:


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;

        }

    }

}

最后,強類型視圖將幾乎但不是很完美。模型將被視為未類型化的對象,因此要進行強類型化輸入,您需要使用類似以下內(nèi)容來啟動共享視圖


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


查看完整回答
反對 回復 2019-10-08
?
人到中年有點甜

TA貢獻1895條經(jīng)驗 獲得超7個贊

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

}

將視圖的“復制到輸出”屬性設(shè)置為“始終復制”


查看完整回答
反對 回復 2019-10-08
  • 3 回答
  • 0 關(guān)注
  • 441 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號