Je me demandais quelle était, si cela est possible, la meilleure façon de rendre un partiel en utilisant le nouveau moteur de vue rasoir. Je comprends que c'est quelque chose qui n'était pas complètement terminé à l'époque
En ce moment, j'utilise RenderPage pour rendre le contrôle utilisateur:
@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)
La page appelant RenderPage utilise une page de mise en page (maître) avec trois sections définies: TitleContent, HeadContent et Maincontent. Lorsque j'essaye de rendre mon contrôle des paramètres régionaux à partir de cette page, il semble que ces sections sont également requises - elles ne devraient être requises que dans la page d'appel et sont présentes. Je reçois le message suivant, que j'inclue ou non les sections dans ma vue partielle (évidemment je ne veux pas inclure ces sections mais cela m'a semblé ê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; Contenu principal
Ma vue partielle est la suivante (adaptée du lien suivant ):
@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>
la source
_Layout.cshtml
fichier dans leShared
dossier et vérifiez comment l'inclusion_LogOnPartial.cshtml
dont dériveWebViewPage
est effectuée (à l'aide de Html.Partial). Donc non, le partiel n'a pas besoin de dériverViewPage
ou pasViewUserControl
du tout pourHtml.Partial
fonctionner.Html.RenderPartial
avec la page ASPX, qui retourne void.Html.Partial
renvoie unMvcHtmlString
. Donc, si votre partiel contient beaucoup de balisage, vous allez créer un objet chaîne potentiellement très volumineux uniquement pour le GC immédiatement. Existe-t-il une approche qui prend en charge le rendu directement sur la sortie à l'aide de Razor?@{...}
bloc devrait fonctionner. Aucune idée s'il existe une meilleure solution.Si vous ne voulez pas dupliquer le code, et comme moi, vous voulez juste afficher des statistiques, dans votre modèle de vue, vous pouvez simplement passer les modèles dont vous souhaitez obtenir des données comme suit:
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, transmettez-les au modèle de vue et renvoyez-le, exemple:
GameViewModel PlayerStats = new GameViewModel(); GamePlayer currentPlayer = (from c in db.GamePlayer [more queries]).FirstOrDefault();
[code pour vérifier si 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 souhaitez afficher les statistiques des tables pertinentes, et qu'aucune autre partie du processus CRUD n'est en cours, pour des raisons de sécurité que d'autres personnes ont mentionnées ci-dessus.
la source