回答:
ビューへのパスとファイル拡張子を含めるだけです。
かみそり:
@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)
ASP.NETエンジン:
<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>
それが問題ではない場合は、RenderUserControlで使用していたコードを含めてもらえますか?
FindPartialView
メソッドを次のようなものでオーバーライドすることですif(partialViewName.Contains"/")partialViewName="~/Views/"+partialViewName;
私の場合、私はMvcMailer(https://github.com/smsohan/MvcMailer)を使用していて、「共有」されていない別のフォルダーから部分ビューにアクセスしたいと思っていました。上記のソリューションは機能しませんでしたが、相対パスを使用すると機能しました。
@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
この他のパスを頻繁に使用している場合は、常にパスを指定する必要なく、これを永続的に修正できます。デフォルトでは、ViewフォルダーとSharedフォルダーの部分的なビューがチェックされます。しかし、追加したいとします。
モデルフォルダにクラスを追加します。
public class NewViewEngine : RazorViewEngine {
private static readonly string[] NEW_PARTIAL_VIEW_FORMATS = new[] {
"~/Views/Foo/{0}.cshtml",
"~/Views/Shared/Bar/{0}.cshtml"
};
public NewViewEngine() {
// Keep existing locations in sync
base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NEW_PARTIAL_VIEW_FORMATS).ToArray();
}
}
次に、Global.asax.csファイルに次の行を追加します。
ViewEngines.Engines.Add(new NewViewEngine());
私はかなりうまく機能しているように見える回避策を作成しました。アクション名のルックアップ、ビューのルックアップなどを行うために、別のコントローラーのコンテキストに切り替える必要があることがわかりました。これを実装するために、の新しい拡張メソッドを作成しましたHtmlHelper
。
public static IDisposable ControllerContextRegion(
this HtmlHelper html,
string controllerName)
{
return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}
ControllerContextRegion
と定義されている:
internal class ControllerContextRegion : IDisposable
{
private readonly RouteData routeData;
private readonly string previousControllerName;
public ControllerContextRegion(RouteData routeData, string controllerName)
{
this.routeData = routeData;
this.previousControllerName = routeData.GetRequiredString("controller");
this.SetControllerName(controllerName);
}
public void Dispose()
{
this.SetControllerName(this.previousControllerName);
}
private void SetControllerName(string controllerName)
{
this.routeData.Values["controller"] = controllerName;
}
}
これをビュー内で使用する方法は次のとおりです。
@using (Html.ControllerContextRegion("Foo")) {
// Html.Action, Html.Partial, etc. now looks things up as though
// FooController was our controller.
}
コードでcontroller
ルートコンポーネントが変更されないようにする必要がある場合、これには望ましくない副作用がある可能性がありますが、これまでのコードでは、このアプローチの欠点はないようです。
WebFormsViewEngineのベースとなっているVirtualPathProviderViewEngineは、パスの先頭にある「〜」および「/」文字をサポートするため、上記の例が機能するはずです。
あなたの例ではパス「〜/ Account / myPartial.ascx」を使用していることに気付きましたが、ユーザーコントロールはViews / Accountフォルダーにあると述べました。やってみました
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
それともあなたの質問のタイプミスですか?
ASP.NET Core 2.1以降を使用していて、Partial Tag Helper構文を使用したい読者は、次のことを試してください。
<partial name="~/Views/Folder/_PartialName.cshtml" />
チルダ(〜)はオプションです。
カスタムビューエンジンを作成し、ViewEngineResultを返すメソッドを用意するこの例では、を上書きし_options.ViewLocationFormats
てフォルダーディレクトリを追加します。
public ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage)
{
var controllerName = context.GetNormalizedRouteValue(CONTROLLER_KEY);
var areaName = context.GetNormalizedRouteValue(AREA_KEY);
var checkedLocations = new List<string>();
foreach (var location in _options.ViewLocationFormats)
{
var view = string.Format(location, viewName, controllerName);
if (File.Exists(view))
{
return ViewEngineResult.Found("Default", new View(view, _ViewRendering));
}
checkedLocations.Add(view);
}
return ViewEngineResult.NotFound(viewName, checkedLocations);
}