Модель MVC 3 переходит в определенный раздел - PullRequest
1 голос
/ 02 февраля 2012

У меня есть раздел "LoginBox", определенный в _Layout.cshtml, и его модель AccountModel. Так что он всегда будет отображаться на каждой странице, но я хочу знать, действительно ли мне нужно передавать эту модель в каждую ViewModel? Мой пример IndexViewModel выглядит так:

public class IndexViewModel
    {
        public BulletinModel Bulletin { get; set; }
        public CategoryModel Category { get; set; }
    }

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Если вы не хотите передавать свою дополнительную модель каждой из основных моделей ViewModel, вы также можете попробовать использовать @ Html.RenderAction (ActionName, ControllerName)

  • Создатьновый метод действия и создайте частичное представление для этого нового действия.
  • Поместите (или) создайте свою модель (дополнительную) в свой новый метод действия и передайте ее в свое частичное представление.
  • Вызовэтот новый метод Action со страницы _Layout с помощью Html.RenderAction ().

    @ {Html.RenderAction ("ActionName", "ControllerName");}

1 голос
/ 02 февраля 2012

Нет, вам абсолютно не обязательно определять это в каждой ViewModel. Обычно в _Layout View сохраняются постоянные элементы макета, определенные следующим образом:

@using YourModelsNS

@* layout markup omitted for brevity *@

<div id="header">
        <div id="title">
            <h1>My MVC Application</h1>
        </div>
        <div id="logindisplay">
            @Html.Partial("_LogOnPartial", new YourMode() { SomeString = "Test" })
        </div>
        <div id="menucontainer">
            <ul id="menu">
                <li>@Html.ActionLink("Home", "Index", "Home")</li>
                <li>@Html.ActionLink("About", "About", "Home")</li>
                <li>@Html.ActionLink("Test", "Test", "Test")</li>
            </ul>
        </div>
    </div>
    <div id="main">
        @RenderBody()
    </div>
    <div id="footer">
    </div>
</div>

Обратите внимание, что в представлении вы видите @Html.Partial("_LogOnPartial"). Это то, что затем отображает конкретный вид, _LogOnPartial.cshtml. Который содержит эту разметку:

@model YourModelNS.YourModel

@if(Request.IsAuthenticated) {
    <text>Welcome <strong>@User.Identity.Name</strong>!
    [ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
}
else {
    @:[ @Html.ActionLink("Log On", "LogOn", "Account") ]
}

@Model.SomeString

Это отдельно от страниц контента, которые отображаются с помощью @RenderBody (), поэтому вам не нужно будет включать отдельные задачи во все ViewModels или сами представления.

РЕДАКТИРОВАТЬ : Код был отредактирован для передачи объекта модели в частичное представление. Теперь каждая страница контента (по RenderBody() не знает модель YourModel), и соответствующие им ViewModels не должны ничего знать об этом.

Отказ от ответственности: я не рекомендую вышеупомянутую практику кода, упущение логики контроллера заключается просто в сосредоточении внимания на рассматриваемом вопросе.

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