Je me demandais quelle était, s'il était possible, le meilleur moyen de rendre une partielle à l'aide du nouveau moteur de vue rasoir. Je comprends que c'est quelque chose qui n'était pas encore complètement terminé
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 présentation (principale) avec trois sections définies: TitleContent, HeadContent et Maincontent. Lorsque je tente de rendre mon contrôle de paramètres régionaux à partir de cette page, il apparaît que ces sections sont également obligatoires. 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 (je ne souhaite évidemment 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 présentation '~/Views/Shared/LocaleUserControl.cshtml': TitleContent; HeadContent; Contenu principal
Ma vue partielle est la suivante (adaptée de ce qui suit link ):
@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>
Votre partial ressemble beaucoup à un modèle d’éditeur, vous pouvez donc l’inclure en tant que tel (en supposant bien sûr que votre partiel soit placé dans le ~/views/controllername/EditorTemplates
_ sous-dossier):
@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)
Ou si ce n'est pas le cas simplement:
@Html.Partial("nameOfPartial", Model)
Si vous ne voulez pas dupliquer le code et que, comme moi, vous voulez simplement afficher les statistiques, dans votre modèle d'affichage, vous pouvez simplement transmettre les modèles à partir desquels vous souhaitez obtenir des données:
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 faire cela que si vous voulez afficher les statistiques des tableaux pertinents, et qu'il n'y a aucune autre partie du processus CRUD en cours, pour des raisons de sécurité, d'autres personnes ont mentionné ci-dessus.