web-dev-qa-db-fra.com

Créer un contrôleur pour une vue partielle dans ASP.NET MVC

Comment créer un contrôleur et un modèle individuels pour une vue partielle? Je veux pouvoir placer cette vue partielle n'importe où sur le site afin qu'il ait besoin de son propre contrôleur. Je suis en cours rendant le partiel comme si

@Html.Partial("_Testimonials")
56
brenjt

Pourquoi ne pas utiliser Html.RenderAction() ?

Vous pouvez ensuite mettre les éléments suivants dans n’importe quel contrôleur (même en créant un nouveau contrôleur):

[ChildActionOnly]
public ActionResult MyActionThatGeneratesAPartial(string parameter1)
{
    var model = repository.GetThingByParameter(parameter1);
    var partialViewModel = new PartialViewModel(model);
    return PartialView(partialViewModel); 
}

Vous pouvez ensuite créer une nouvelle vue partielle et faire en sorte que votre PartialViewModel soit ce dont elle hérite.

Pour Razor, le bloc de code dans la vue ressemblerait à ceci:

@{ Html.RenderAction("Index", "Home"); }

Pour WebFormsViewEngine, cela ressemblerait à ceci:

<% Html.RenderAction("Index", "Home"); %>
104
George Stocker

Si c'était moi, je créerais simplement un nouveau contrôleur avec une action unique, puis utiliserais RenderAction à la place de partiel:

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

Il n'a pas besoin de son propre contrôleur. Vous pouvez utiliser

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

Cela vous permet de rendre le partiel de n'importe quelle page. Assurez-vous simplement que le chemin relatif est correct.

8
Slick86

Vous n’avez pas besoin d’un contrôleur et lorsque vous utilisez .Net 5 (MVC 6), vous pouvez rendre la vue partielle async.

@await Html.PartialAsync("_LoginPartial")

ou

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

ou si vous utilisez .net core 2.1> vous pouvez simplement utiliser :

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

Le plus important est que l’action créée doit renvoyer une vue partielle, voir ci-dessous.

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

Html.Action est une technologie mal conçue . Parce que dans votre contrôleur de page, vous ne pouvez pas recevoir les résultats du calcul dans votre contrôleur partiel. Le flux de données est uniquement Contrôleur de page => Contrôleur partiel.

Pour être plus proche de WebForm UserControl (* .ascx), vous devez:

  1. Créer un modèle de page et un modèle partiel

  2. Placez votre modèle partiel en tant que propriété dans votre page

  3. Dans la vue de la page, utilisez Html.EditorFor (m => m.MyPartialModel).
  4. Créer une vue partielle appropriée
  5. Créez une classe très similaire à ce contrôleur d'action enfant décrit ici dans les réponses à plusieurs reprises. Mais ce sera juste une classe (héritée de Object plutôt que de Controller). Appelons-le comme MyControllerPartial. MyControllerPartial ne saura que sur le modèle partiel.
  6. Utilisez votre MyControllerPartial dans votre contrôleur de page. Passez modèle.MyPartialModel à MyControllerPartial
  7. Faites attention au préfixe approprié dans votre MyControllerPartial. Exemple Fox: ModelState.AddError ("MyPartialModel." + "SomeFieldName", "Error")
  8. Dans MyControllerPartial, vous pouvez effectuer une validation et implémenter d'autres logiques liées à ce modèle partiel.

Dans cette situation, vous pouvez l'utiliser comme:

public class MyController : Controller
{
    ....
    public MyController()
    {
    MyChildController = new MyControllerPartial(this.ViewData);
    }

    [HttpPost]
    public ActionResult Index(MyPageViewModel model)
    {
    ...
    int childResult = MyChildController.ProcessSomething(model.MyPartialModel);
    ...
    }
}

P.S . À l'étape 3, vous pouvez utiliser Html.Partial ("PartialViewName", Model.MyPartialModel, <clone_ViewData_with_prefix_MyPartialModel>). Pour plus de détails, voir Vues partielles ASP.NET MVC: préfixes de nom d'entrée

0
Yury Shpakov