部分ビューの個々のコントローラーとモデルを作成するにはどうすればよいですか?この部分ビューをサイト上の任意の場所に配置できるようにしたいので、独自のコントローラーが必要です。私は現在、パーシャルをそうレンダリングしています
@Html.Partial("_Testimonials")
なぜ Html.RenderAction()
を使用しないのですか?
次に、以下をコントローラに追加します(そのための新しいコントローラを作成することもできます)。
[ChildActionOnly]
public ActionResult MyActionThatGeneratesAPartial(string parameter1)
{
var model = repository.GetThingByParameter(parameter1);
var partialViewModel = new PartialViewModel(model);
return PartialView(partialViewModel);
}
次に、新しい部分ビューを作成し、PartialViewModel
を継承元にすることができます。
Razorの場合、ビューのコードブロックは次のようになります。
@{ Html.RenderAction("Index", "Home"); }
WebFormsViewEngineの場合、次のようになります。
<% Html.RenderAction("Index", "Home"); %>
私の場合は、単一のアクションで新しいコントローラーを作成し、Partialの代わりにRenderActionを使用します。
// Assuming the controller is named NewController
@{Html.RenderAction("ActionName",
"New",
new { routeValueOne = "SomeValue" });
}
独自のコントローラーは必要ありません。使用できます
@Html.Partial("../ControllerName/_Testimonials.cshtml")
これにより、任意のページからパーシャルをレンダリングできます。相対パスが正しいことを確認してください。
最も重要なことは、作成されたアクションは部分ビューを返す必要があることです。以下を参照してください。
public ActionResult _YourPartialViewSection()
{
return PartialView();
}
コントローラーは不要です。Net5(MVC 6)を使用する場合、部分ビューを非同期でレンダリングできます。
@await Html.PartialAsync("_LoginPartial")
または
@{await Html.RenderPartialAsync("PartialName");}
または、.net core 2.1を使用している場合は、単に se を使用できます。
<partial name="Shared/_ProductPartial.cshtml"
for="Product" />
Html.Actionは、設計が不十分なテクノロジーです。ページコントローラーでは、パーシャルコントローラーで計算の結果を受け取ることができないためです。データフローは、Page Controller => Partial Controllerのみです。
WebForm UserControl(* .ascx)に近づけるには、以下を行う必要があります。
ページモデルと部分モデルを作成する
ページモデルのプロパティとして部分モデルを配置する
この状況では、次のように使用できます。
public class MyController : Controller
{
....
public MyController()
{
MyChildController = new MyControllerPartial(this.ViewData);
}
[HttpPost]
public ActionResult Index(MyPageViewModel model)
{
...
int childResult = MyChildController.ProcessSomething(model.MyPartialModel);
...
}
}
追伸ステップ3では、Html.Partial( "PartialViewName"、Model.MyPartialModel、<clone_ViewData_with_prefix_MyPartialModel>)を使用できます。詳細については、「 ASP.NET MVC部分ビュー:入力名プレフィックス 」を参照してください