85 votes

Moteur de vues Razor - Comment puis-je ajouter des vues partielles ?

Je me demandais, si c'est possible, quelle est la meilleure façon de rendre un partiel en utilisant le nouveau moteur de vue Razor. Je comprends qu'il s'agit de quelque chose qui n'était pas complètement terminé au moment de la mise en place du nouveau moteur.

Actuellement, j'utilise RenderPage pour rendre le contrôle de l'utilisateur :

@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)

La page qui appelle RenderPage utilise une page de mise en page (maître) avec trois sections définies : TitleContent, HeadContent et Maincontent. Lorsque j'essaie de rendre mon contrôle local à partir de cette page, il apparaît que ces sections sont également requises - elles ne devraient être requises que dans la page appelante et sont présentes. Je reçois le message suivant, que j'inclue ou non les sections dans ma vue partielle (de toute évidence, je ne veux pas inclure ces sections, mais cela semblait être un point de débogage intéressant...).

Les sections suivantes ont été définies mais n'ont pas été rendues sur la page de mise en page ~/Views/Shared/LocaleUserControl.cshtml' : TitleContent ; HeadContent ; MainContent

Ma vision partielle est la suivante (adaptée de ce qui suit) enlace ):

@inherits System.Web.Mvc.WebViewPage<LocaleBaseModel>
@using System.Web.UI;

<p>
     @Html.LabelFor(model => Model.CountryName)
    <br />
    @Html.DropDownListFor(model => Model.CountryName,null, string.Empty, new { @class = "text", accesskey="u"})
</p>
<p>
     @Html.LabelFor(model => Model.StateProvince)
    <br />
     @Html.DropDownListFor(model => Model.StateProvince, null, string.Empty, new { @class = "text", accesskey="t" })
</p>

<script type="text/javascript">
    $(function () {
        var countries = $("#CountryName");
        var statesprovinces = $("#StateProvince");
        countries.change(function () {
            statesprovinces.find('option').remove();
            var url = '@Url.Action("GetStatesProvinces", "Base")';
            $.getJSON(url, { countryId: countries.val() }, function (data) {
                $(data).each(function () {
                    $("<option value=" + this.ID + ">" + this.Name + "</option>").appendTo(statesprovinces);
                });
            });
        });
    });
</script>

127voto

Darin Dimitrov Points 528142

Votre partiel ressemble beaucoup à un modèle d'éditeur, vous pouvez donc l'inclure en tant que tel (en supposant bien sûr que votre partiel est placé dans le dossier de l'éditeur). ~/views/controllername/EditorTemplates sous-dossier) :

@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)

Ou si ce n'est pas le cas, tout simplement :

@Html.Partial("nameOfPartial", Model)

0voto

Jay Points 86

Si vous ne voulez pas dupliquer le code, et comme moi vous voulez juste montrer les statistiques, dans votre modèle de vue, vous pouvez simplement passer dans les modèles dont vous voulez obtenir les données comme ceci :

public class GameViewModel
{
    public virtual Ship Ship { get; set; }
    public virtual GamePlayer GamePlayer { get; set; }     
}

Ensuite, dans votre contrôleur, exécutez simplement vos requêtes sur les modèles respectifs, passez-les au modèle de vue et renvoyez-le, par exemple :

GameViewModel PlayerStats = new GameViewModel();

GamePlayer currentPlayer = (from c in db.GamePlayer [more queries]).FirstOrDefault();

[code pour vérifier les résultats]

//pass current player into custom view model
PlayerStats.GamePlayer = currentPlayer;

Comme je l'ai dit, vous ne devriez vraiment le faire que si vous voulez afficher les statistiques des tables concernées, et qu'aucune autre partie du processus CRUD ne se produit, pour des raisons de sécurité que d'autres personnes ont mentionnées ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X