我有一個 Razor Pages 專案(無控制器),其結構如下:

從 main Index.cshtml,我會根據主題名稱為其內容呈現部分視圖,例如:
@* Default will be replaced with theme name *@
<partial name="Themes\Default\HomeContent" />
在 中HomeContent.cshtml,我想在其檔案夾中呈現許多其他區域視圖。但是這行不通:
<p>Content</p>
<partial name="_DefaultThemePartial" />
引擎只搜索這些位置(根據檔案正確):
InvalidOperationException: 未找到區域視圖“_DefaultThemePartial”。搜索了以下位置:
/Pages/_DefaultThemePartial.cshtml
/Pages/Shared/_DefaultThemePartial.cshtml
/Views/Shared/_DefaultThemePartial.cshtml
我也嘗試<partial name="./_DefaultThemePartial" />或<partial name=".\_DefaultThemePartial" />嘗試將它們放在名為Shared(在默認檔案夾內)的子檔案夾中。它們都不起作用,僅搜索上述 3 個位置。
無論如何要在不指定完整路徑的情況下渲染這些部分?
uj5u.com熱心網友回復:
我在這里發布了一個提案。同時,我發現您可以通過使用來擴展發現機制,IViewLocationExpander但我幾乎找不到任何有用的檔案。
public class PartialViewLocationExpander : IViewLocationExpander
{
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
{
if (!context.Values.TryGetValue("FromView", out var fromView))
{
return viewLocations;
}
var folder = Path.GetDirectoryName(fromView) ?? "/";
var name = context.ViewName;
if (!name.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase))
{
name = ".cshtml";
}
var path = Path.Combine(folder, name)
.Replace('\\', '/');
return viewLocations.Concat(new[] { path });
}
public void PopulateValues(ViewLocationExpanderContext context)
{
var ctx = context.ActionContext as ViewContext;
if (ctx == null) { return; }
var path = ctx.ExecutingFilePath;
if (!string.IsNullOrEmpty(path))
{
context.Values["FromView"] = path;
context.Values["ViewName"] = context.ViewName;
}
}
}
// Register
services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(new PartialViewLocationExpander());
});
uj5u.com熱心網友回復:
從我的GitHub 問題的回復來看,有一個更簡單的解決方案,無需任何額外代碼,只需.cshtml在末尾添加:
[...] 這是設計使然。部分視圖查找通過兩種方式完成:
按名字
按檔案路徑
您已經完成了按名稱查找(沒有檔案擴展名),如果要使用相對路徑,請確保指定檔案擴展名。
<partial name="_DefaultThemePartial.cshtml" />
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381414.html
標籤:C# 。网 asp.net-mvc 剃刀 .net-6.0
下一篇:Spark:如何將字串轉換為多列
