Механизм просмотра Razor - Как добавить частичные представления
Мне было интересно, что, если это возможно, лучший способ сделать частичное использование нового механизма просмотра бритвы. Я понимаю, что это то, что не было полностью завершено к моменту
Сейчас я использую RenderPage для визуализации пользовательского элемента управления:
@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)
Страница, вызывающая RenderPage, использует страницу макета (мастер) с тремя определенными разделами: TitleContent, HeadContent и Maincontent. Когда я пытаюсь отобразить мой элемент управления на этой странице, кажется, что эти разделы также необходимы - они должны быть необходимы только на вызывающей странице и присутствовать. Я получаю следующее сообщение, независимо от того, включаю ли я разделы в моем частичном представлении (очевидно, я не хочу включать эти разделы, но это казалось интересной точкой отладки...).
Следующие разделы были но не были страница макета '~/Views/Shared/LocaleUserControl.cshtml': TitleContent; HeadContent; MainContent
Мой частичный вид выглядит следующим образом (адаптировано из следующей ссылка):
@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>
Ответы
Ответ 1
Вы частично выглядите так же, как шаблон редактора, поэтому можете включить его как таковой (предполагая, что ваша частичная часть находится в подпапке ~/views/controllername/EditorTemplates
):
@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)
Или, если это не так:
@Html.Partial("nameOfPartial", Model)
Ответ 2
Если вы не хотите дублировать код, и, как и я, вы просто хотите показать статистику, в вашей модели просмотра вы можете просто передать модели, которые хотите получить данные, например:
public class GameViewModel
{
public virtual Ship Ship { get; set; }
public virtual GamePlayer GamePlayer { get; set; }
}
Затем в вашем контроллере просто запустите свои запросы на соответствующих моделях, передайте их в модель представления и верните ее, например:
GameViewModel PlayerStats = new GameViewModel();
GamePlayer currentPlayer = (from c in db.GamePlayer [more queries]).FirstOrDefault();
[код для проверки результатов]
//pass current player into custom view model
PlayerStats.GamePlayer = currentPlayer;
Как я уже сказал, вы действительно должны это делать, только если хотите отобразить статистику из соответствующих таблиц, и нет другой части процесса CRUD, из соображений безопасности, о которых говорили другие люди выше.