Razor view engine - Как мне добавить частичные виды - PullRequest
83 голосов
/ 01 августа 2010

Мне было интересно, что, если это возможно, является лучшим способом визуализации частичного с использованием нового движка вида бритвы.Я понимаю, что это то, что не было полностью завершено к тому времени

. Сейчас я использую 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>

Ответы [ 2 ]

123 голосов
/ 01 августа 2010

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

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

Или, если это не так, просто:

@Html.Partial("nameOfPartial", Model)
0 голосов
/ 17 июня 2014

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

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 не происходит из-за соображений безопасности, упомянутых выше другими людьми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...