web-dev-qa-db-ja.com

ASP.NET MVCで部分ビューのコントローラーを作成します

部分ビューの個々のコントローラーとモデルを作成するにはどうすればよいですか?この部分ビューをサイト上の任意の場所に配置できるようにしたいので、独自のコントローラーが必要です。私は現在、パーシャルをそうレンダリングしています

@Html.Partial("_Testimonials")
59
brenjt

なぜ 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"); %>
104
George Stocker

私の場合は、単一のアクションで新しいコントローラーを作成し、Partialの代わりにRenderActionを使用します。

// Assuming the controller is named NewController
@{Html.RenderAction("ActionName", 
                     "New", 
                      new { routeValueOne = "SomeValue" });
}
9
Justin Niessner

独自のコントローラーは必要ありません。使用できます

@Html.Partial("../ControllerName/_Testimonials.cshtml")

これにより、任意のページからパーシャルをレンダリングできます。相対パスが正しいことを確認してください。

8
Slick86

最も重要なことは、作成されたアクションは部分ビューを返す必要があることです。以下を参照してください。

public ActionResult _YourPartialViewSection()
{
    return PartialView();
}
4
Wen Chen

コントローラーは不要です。Net5(MVC 6)を使用する場合、部分ビューを非同期でレンダリングできます。

@await Html.PartialAsync("_LoginPartial")

または

@{await Html.RenderPartialAsync("PartialName");}

または、.net core 2.1を使用している場合は、単に se を使用できます。

<partial name="Shared/_ProductPartial.cshtml"
         for="Product" />
3
GoldenAge

Html.Actionは、設計が不十分なテクノロジーです。ページコントローラーでは、パーシャルコントローラーで計算の結果を受け取ることができないためです。データフローは、Page Controller => Partial Controllerのみです。

WebForm UserControl(* .ascx)に近づけるには、以下を行う必要があります。

  1. ページモデルと部分モデルを作成する

  2. ページモデルのプロパティとして部分モデルを配置する

  3. ページのビューでHtml.EditorFor(m => m.MyPartialModel)を使用します
  4. 適切な部分ビューを作成する
  5. ここで何度も回答で説明したChild Action Controllerに非常によく似たクラスを作成します。ただし、これは単なるクラスになります(コントローラーからではなく、オブジェクトから継承されます)。 MyControllerPartialと名付けましょう。 MyControllerPartialは部分モデルのみを認識します。
  6. ページコントローラーでMyControllerPartialを使用します。 model.MyPartialModelをMyControllerPartialに渡す
  7. MyControllerPartialの適切なプレフィックスに注意してください。 Foxの例:ModelState.AddError( "MyPartialModel。" + "SomeFieldName"、 "Error")
  8. MyControllerPartialでは、検証を行い、この部分モデルに関連する他のロジックを実装できます。

この状況では、次のように使用できます。

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部分ビュー:入力名プレフィックス 」を参照してください

0
Yury Shpakov