268

ビューに別のフォルダーから部分 (ユーザー コントロール) をレンダリングさせるにはどうすればよいですか? プレビュー 3 では完全なパスを指定して RenderUserControl を呼び出していましたが、プレビュー 5 にアップグレードすると、これができなくなります。代わりに RenderPartial メソッドを取得しましたが、探している機能が提供されていません。

4

10 に答える 10

467

ビューへのパスとファイル拡張子を含めるだけです。

かみそり:

@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)

ASP.NET エンジン:

<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>

それがあなたの問題でない場合は、RenderUserControl で動作していたコードを含めていただけますか?

于 2008-10-16T13:02:06.203 に答える
33

私の場合、MvcMailer(https://github.com/smsohan/MvcMailer)を使用していて、「共有」にない別のフォルダーから部分的なビューにアクセスしたいと考えていました。上記の解決策は機能しませんでしたが、相対パスを使用すると機能しました。

@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
于 2013-01-02T16:13:17.667 に答える
29

この別のパスを頻繁に使用している場合は、常にパスを指定しなくても、これを永続的に修正できます。デフォルトでは、View フォルダと Shared フォルダの部分ビューがチェックされます。しかし、1 つ追加したいとします。

Models フォルダーにクラスを追加します。

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());
于 2015-03-11T16:04:26.507 に答える
7

Views / AccountフォルダーにあるmyPartial.ascxという名前のユーザーコントロールの場合、次のように記述します。

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
于 2010-06-27T08:49:22.940 に答える
5

かなりうまく機能していると思われる回避策を作成しました。アクション名の検索、ビューの検索などのために、別のコントローラーのコンテキストに切り替える必要があることがわかりました。これを実装するために、次の新しい拡張メソッドを作成しました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これまでのコードでは、このアプローチにマイナス面はないようです。

于 2012-09-13T00:51:55.040 に答える
4

WebFormsViewEngine のベースとなる VirtualPathProviderViewEngine は、パスの先頭で「~」および「/」文字をサポートすることになっているため、上記の例は機能するはずです。

あなたの例ではパス「~/Account/myPartial.ascx」を使用していることに気付きましたが、ユーザー コントロールは Views/Account フォルダーにあると述べました。やってみました

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>

またはそれはあなたの質問の単なるタイプミスですか?

于 2008-10-20T23:52:21.817 に答える
0

あなたはこれを試してみるべきです

~/Views/Shared/parts/UMFview.ascx

コードの~/Views/前に配置します

于 2011-01-09T12:38:48.763 に答える
0

カスタム ビュー エンジンを作成し、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);
        }

例: https://github.com/AspNetMonsters/pugzor

于 2019-06-04T12:50:42.473 に答える
-5

使ってみてRenderAction("myPartial","Account");

于 2011-05-31T00:09:22.960 に答える