web-dev-qa-db-fra.com

ASP.NET MVC 3 Vue partielle dans la page de présentation

Je travaille sur la configuration d'un contenu partagé (navigation) pour une page de présentation asp.net MVC.

Voici ma vue partielle "_LayoutPartial.cshtml" avec du code permettant d'extraire les données de navigation d'un modèle.

@model MyApp.Models.ViewModel.LayoutViewModel
<p>

    @foreach (var item in Model.navHeader)
    {
        //Test dump of navigation data
        @Html.Encode(item.Name); 
        @Html.Encode(item.URL); 

    }
</p>

Voici à quoi ressemble le code de mon contrôleur "LayoutController.cs".

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyApp.Models.ViewModel;

namespace MyApp.Controllers
{
    public class LayoutController : Controller
    {

        //
        // GET: /Layout/

        LayoutViewModel layout = new LayoutViewModel();

        public ActionResult Index()
        {
            return View(layout);
        }

    }
}

Voici le code de la page "_Layout.cshtml". J'essaie d'appeler la vue partielle ici en utilisant la méthode Html.RenderAction (Action, Controller).

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <p>
        @{Html.RenderAction("Index","Layout");}
    </p>

    @RenderBody()
</body>
</html>

Lorsque la page de présentation exécute la ligne @ {Html.RenderAction ("Index", "Layout");}, elle génère un message d'erreur "Erreur d'exécution de la demande enfant du gestionnaire System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper". "

Qu'est-ce qui me manque des amis? Comment appeler une vue partielle dans une page de mise en page?

Merci d'avance à tous!

11
Felasfaw

Au lieu de:

public ActionResult Index()
{
    return View(layout);
}

faire:

public ActionResult Index()
{
    return PartialView(layout);
}

Si vous ne le faites pas lorsque vous retournez une vue normale à partir de votre action enfant, cette vue normale tente d'inclure la disposition, qui à son tour tente de restituer l'action enfant, ce qui retourne une vue, qui inclut à son tour la disposition. , qui à son tour tente de rendre l'action enfant, ... et nous nous retrouvons avec des noms similaires à ceux portés par ce même site.

De plus, dans votre partie, vous n'avez pas besoin de faire un double encodage. La fonction @ Razor encode déjà le code HTML:

@model MyApp.Models.ViewModel.LayoutViewModel
<p>

    @foreach (var item in Model.navHeader)
    {
        @item.Name 
        @item.URL
    }
</p>
17
Darin Dimitrov

Commencez par vérifier que votre vue enfant se trouve dans le répertoire Shared

@Html.Partial("_LayoutPartial")

OR

 @{Html.RenderAction("actionname", "controller name");}

Et n'utilisez pas @Html.Encode(), Razor le fait déjà pour vous. Juste utiliser

@item.Name 
@item.URL
6
DotNet Dreamer

J'ai résolu cette erreur en accédant à la page de mise en page

System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper

Important! Commencez par créer une vue partielle dans un dossier partagé.

En contrôleur,

public PartialViewResult Userdetails()
{
   ....
   return PartialView("PartialViewName", obj);  
}

Dans la page de mise en page,

@{Html.RenderAction("action","controller");}
2
Piyush Katkar

Je sais que c’est une vieille question, mais j’avais l’intention de la jeter ici. Vous pouvez utiliser Html.Action ou Html.RenderAction. Techniquement, ils font tous les deux la même chose mais, en fonction de la quantité de contenu que vous renvoyez en retour, cela peut avoir un impact sur celui que vous devriez vraiment utiliser pour une meilleure efficacité.

Les deux méthodes vous permettent d'appeler une méthode d'action à partir d'une vue et de générer les résultats de l'action en place dans la vue. La différence entre les deux est que Html.RenderAction rendra le résultat directement à la réponse (ce qui est plus efficace si l'action retourne une grande quantité de HTML) alors que Html.Action renvoie une chaîne avec le résultat.

La source

0
Quiver