2016-06-07 29 views
0

有時候,控制器需要檢查一個視圖是否存在,以便它可以採取一些行動,如果它不存在?如何告訴控制器存在ASP.NET Core視圖?

我以前看過類似這個問題的Does a View Exist in Asp.Net MVC?以前的版本的asp.net mvc,但是這樣的方法對ASP.NET Core不起作用。我一直無法找到任何關於如何在控制器內部使用ASP.NET Core執行此操作的文檔。

考慮以下幾點:

string viewLoc= "~/views/some-folder/some-file.cshtml"; 

控制器如何確定視圖是否存在?

回答

0

在我看來,這是一個糟糕的設計時,視圖不存在運行時 - 但可能我不明白的情況。

但是,回答你的問題: 我不知道任何具體的方法來做到這一點,但...查看是一個文件,所以你可以檢查文件是否存在磁盤上?

例如:

  • System.IO.File.Exists(@"Views\Home\Index.cshtml");
  • System.IO.File.Exists(@".\Views\Home\Index.cshtml");

不要在這種情況下~,只是Views\.\Views\

+0

我用類似的方法想出很好,但使用的是通過附加實現的絕對路徑''IHostingEnvironment'但ContentRootPath'感覺有點髒對我來說,因爲我可以看到,我可以注入'IRazorViewEngine'到控制器中,它有一個'FindView'方法。但我永遠無法將'ViewEngineResult.Success'重新設置爲true。所以最終我沒有使用System.IO.FIle.Exists。 –

+0

請注意,'IApplicationEnvironment'和'IRuntimeEnvironment'在RC2中被刪除,並且可以通過'Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default'靜態訪問,更多信息:https://github.com/aspnet/PlatformAbstractions/issues/37 –

+0

好的提示。在我的情況下,我使用'IHostingEnvironment'來獲取'ContentRootPath'。 'IHostingEnvironment'是'Controller'注入RC2。 –

5

這是我在天冬氨酸解決了這個問題.Net Core 1.0。使用ICompositeViewEngine。這是一個例子。

private readonly ICompositeViewEngine _compositeViewEngine; 

public YourController(ICompositeViewEngine compositeViewEngine) 
{ 
    _compositeViewEngine = compositeViewEngine; 
} 

,然後在行動:

[Route("/location/{name}")] 
public IActionResult Location(string name) 
{ 
    var viewName = $"~/Views/Location/{name}.cshtml"; 
    var result = _compositeViewEngine.GetView("", viewName, false); 

    if (result.Success) return View(viewName); 

    // or do whatever you want 
    return NotFound(); 
} 
相關問題