1. ホーム
  2. c#

[解決済み] コントローラから別のコントローラの部分ビューを返すには?

2023-07-12 15:45:28

質問

私は XXX.cshtml ファイルを Views\ABC フォルダの中にあります。そのコントローラは ABC

また、アクションメソッドを DEF コントローラで Partialview("XXX" , xyzmodel)

ビューが見つかりません"というエラーが出ます。

どのようにその ビュー を他のコントローラから呼び出すには

どのように解決するのですか?

通常、ビューには特定の 対応するコントローラ に属するか、あるいはビューがそのデータ要件をサポートする Views/Shared フォルダに属します (これが名前の由来です)。

"回答"(ただし、推奨されません - 下記参照)。

あなたは できます のようにフルパス(拡張子を含む)を指定することで、別のコントローラからビュー/部分ビューを参照することができます。

return PartialView("~/views/ABC/XXX.cshtml", zyxmodel);

または相対パス(拡張子なし)を指定します。 @Max Toro

return PartialView("../ABC/XXX", zyxmodel);

しかし、これはとにかく良いアイデアではありません

*注:これらは の2つの構文だけです。 ではありません。 ABC\\XXX または ABC/XXX などのバリエーションがありますが、これらはすべて相対パスであるため、一致するものが見つかりません。

より良い代替案

あなたは Html.Renderpartial を使うこともできますが、その場合にも拡張機能が必要です。

Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", modeldata);

使用方法 @Html.Partial を使ってください。

@Html.Partial("~/Views/ControllerName/ViewName.cshtml", modeldata)

を使うことができます。 ../controller/view の構文を拡張なしで使うことができます (再度 @Max Toro の功績です)。

@Html.Partial("../ControllerName/ViewName", modeldata)

注:どうやら RenderPartial は Partial よりも若干速いようですが、それは重要ではありません。

実際に他のコントローラを呼び出したい場合は、使用します。

@Html.Action("action", "controller", parameters)

推奨される解決策 Html.Action

私の個人的な好みは @Html.Action を使用することで、他のコントローラからビューを相互参照するのではなく、各コントローラが独自のビューを管理することができるからです (これは大きなスパゲッティのような混乱につながります)。

通常は、必要なキー値のみを渡します (他のビューと同様です)。

@Html.Action("XXX", "ABC", new {id = model.xyzId })

これは ABC.XXX アクションを実行し、その結果をインプレースでレンダリングします。これにより、ビューとコントローラを別々に自己完結させることができます(つまり、再利用可能)。

2014年9月更新です。

この度、@Html.Actionは使えないが、ビューパスを作成する必要がある状況にぶち当たりました。 actioncontroller という名前を付けることができます。そのために、私はこの単純な View に拡張メソッドを追加しました。 UrlHelper であるため、return PartialView(Url.View("actionName", "controllerName"), modelData) :

public static class UrlHelperExtension
{
    /// <summary>
    /// Return a view path based on an action name and controller name
    /// </summary>
    /// <param name="url">Context for extension method</param>
    /// <param name="action">Action name</param>
    /// <param name="controller">Controller name</param>
    /// <returns>A string in the form "~/views/{controller}/{action}.cshtml</returns>
    public static string View(this UrlHelper url, string action, string controller)
    {
        return string.Format("~/Views/{1}/{0}.cshtml", action, controller);
    }
}