Механізм подання Razor - Як я можу додати часткові види


84

Мені було цікаво, що, якщо це можливо, найкращий спосіб зробити частковий за допомогою нового механізму подання бритви. Я розумію, це те, що на той час не було закінчено повністю

Зараз я використовую RenderPage для візуалізації керування користувачем:

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

Сторінка, що викликає RenderPage, використовує сторінку макета (master) із трьома розділами: 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>

Відповіді:


124

Ви частково схожий на шаблон редактора, щоб ви могли включити його як такий (припускаючи, звичайно, що ваш частковий розміщений у ~/views/controllername/EditorTemplatesпідпапці):

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

Або якщо це не так просто:

@Html.Partial("nameOfPartial", Model)

Дякуємо за відгук ... Html.EditorFor може бути гарною ідеєю в цьому випадку - але мені було б цікаво побачити альтернативи, оскільки це не стосується більш складних прикладів - я точно натраплю на це найближчим часом. Html.Partial не буде працювати, оскільки він повинен походити від ViewPage або ViewUserControl, тоді як бритва частково походить від WebViewPage ...
JP.

4
Html.Partial чудово працює. Запустіть новий проект ASP.NET MVC 3 у Visual Studio за допомогою механізму подання Razor, відкрийте _Layout.cshtml файл у Sharedпапці та перевірте, як відбувається включення _LogOnPartial.cshtmlякого WebViewPage(за допомогою Html.Partial). Так що ні, частковому не потрібно виводити з ViewPageабо ViewUserControlвзагалі для Html.Partialроботи.
Дарін Димитров

1
Мда, схоже, ти маєш рацію. Це також схоже на те, що мені потрібно зробити кілька налагоджень. Дякую!
JP.

1
Раніше я використовував Html.RenderPartialзі сторінкою ASPX, яка повертає анулювання. Html.Partialповертає MvcHtmlString. Отже, якщо ваш частковий вміст містить багато розмітки, ви створите потенційно дуже великий рядовий об'єкт лише для того, щоб його негайно обробити. Чи існує підхід, який підтримує візуалізацію безпосередньо на виході за допомогою Razor?
Drew Noakes

2
@ Draw Я думаю, що загортання RenderPartial у @{...}блок має спрацювати. Не знаю, чи є краще рішення.
CodesInChaos 02.03.11

0

Якщо ви не хочете дублювати код, і як я, ви просто хочете показати статистику, у вашій моделі перегляду ви можете просто передати моделі, з яких ви хочете отримувати дані, приблизно так:

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 не відбувається, з міркувань безпеки, про які згадали інші люди вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.