Мне было интересно, если это возможно, лучший способ визуализировать партиал с использованием нового движка Razor View. Я понимаю, что к тому времени это еще не было закончено полностью
Прямо сейчас я использую RenderPage для визуализации пользовательского элемента управления:
@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)
Страница, вызывающая RenderPage, использует страницу макета (главную) с тремя определенными разделами: TitleContent, HeadContent и Maincontent. Когда я пытаюсь отобразить свой элемент управления локалью с этой страницы, кажется, что эти разделы также необходимы - они должны быть обязательными только на вызывающей странице и присутствуют. Я получаю следующее сообщение, независимо от того, включаю ли я разделы в свое частичное представление (очевидно, я не хочу включать эти разделы, но это показалось мне интересным моментом для отладки ...).
Следующие разделы были определены, но не отображены на странице макета '~ / Views / Shared / LocaleUserControl.cshtml': TitleContent; HeadContent; Основное содержание
Мое частичное мнение следующее (адаптировано из следующей ссылки ):
@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>
источник
_Layout.cshtml
файл вShared
папке и проверьте, как выполняется включение того, от_LogOnPartial.cshtml
чего происходитWebViewPage
(с помощью Html.Partial). Так что нет, частичное не должно производитьсяViewPage
илиViewUserControl
вообщеHtml.Partial
работать.Html.RenderPartial
страницу ASPX, которая возвращает void.Html.Partial
возвращаетMvcHtmlString
. Итак, если ваш партиал содержит много разметки, вы создадите потенциально очень большой строковый объект только для его немедленной сборки. Есть ли подход, поддерживающий рендеринг непосредственно на выходе с помощью Razor?@{...}
блок должна работать. Не знаю, есть ли лучшее решение.Если вы не хотите дублировать код и, как и я, вы просто хотите отображать статистику, в своей модели представления вы можете просто передать модели, из которых вы хотите получать данные, вот так:
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 не происходит из соображений безопасности, упомянутых выше другими людьми.
источник