2013-07-12 2 views
0

Так в настоящее время в моем файле _layout, у меня есть глобальный логин и система Регистрации, которая будет отображаться на каждой странице:Модель Интерференции с частичным

<div id="global_login_register"> 
    <div id="login"> 
     @Html.Partial("_LoginPartial") 
    </div> 
    <div id="register"> 
     @Html.Partial("_RegisterPartial") 
    </div> 
</div> 

@RenderBody() 

В моей loginPartial страницы у меня есть @model LoginModel и в моем реестре У меня есть @model RegisterModel. Пока все работает, но проблема в том, что когда я пытаюсь представить другую модель в View(), это мешает частичным входам. Единственный способ исправить это - использовать ViewBag и сохранить мою модель там?

+0

Вам не следует использовать ViewBag для передачи вашей модели в ваш вид. Один из вариантов - создать ViewModel, который будет иметь ваши основные классы Model, LoginModel и RegisterModel в качестве свойств. Это зависит от того, сколько у вас разных видов. Мне нужно больше информации о вашем приложении, чтобы дать вам лучший вариант. – ataravati

+0

Проблема с приведенным выше. Если бы у меня была другая страница контроллера, мне также пришлось бы добавить ее также в модель ViewModel. Не было бы проблемой, если бы все мои модели были в классе ViewModel? –

+0

Нет, вы можете создать отдельный ViewModel для другого контроллера (модели). Вот почему я сказал, что это зависит от того, сколько у вас моделей/контроллеров. Но даже если у вас много контроллеров, вы можете создать BaseViewModel с LoginModel и RegisterModel в нем, а затем сделать все остальные ViewModels наследуемыми от BaseViewModel. – ataravati

ответ

0

Если Вашей частичной модели требуется, вам необходимо передать ее с частичным звонком: @Html.Partial("_LoginPartial", aLoginModel). Чем сложнее вопрос, где получить aLoginModel, и есть несколько возможных вариантов ...

  1. Использование @Html.Action(...) отложить до отдельного управления (который может построить LoginModel для вас) - вообще не стоит накладных расходов полный жизненный цикл контроллера, но это чистое решение, если вы можете себе это позволить.
  2. Используйте интерфейс для своего LoginModel и потребуйте, чтобы каждая модель представления реализовала его - почти наверняка не очень хорошая идея, но это сработает.
  3. Сохраните LoginModel в ViewBag/ViewData, используя какой-либо механизм, который должен быть выполнен до того, как ваши представления будут отображаться.
  4. Напишите свой собственный Html помощник, который знает, как построить LoginModel из контекста HtmlHelper. Вы можете использовать этот результат в _layout (например, @Html.Partial("_LoginPartial", Html.LoginModel)) или поместить вызов Partial внутри помощника (например, @Html.Login()).

Для чего-то важного, я бы использовал # 4.

+0

Знаете ли вы какие-нибудь отличные уроки для # 4? Это именно то, что мне нужно. Спасибо за всю эту информацию. Также почему 2 была бы плохой идеей? –

+0

Пример # 4: http://stackoverflow.com/a/5373156/54249 # 2, вероятно, плохая идея, потому что единственный разумный способ ее реализации - использовать базовый класс модели - каждый раз, когда я это делал , Я пожалел об этом. Кроме того, вам нужно будет инициализировать состояние, связанное с регистрацией, в какой-то момент жизненного цикла контроллера (возможно, фильтр «OnActionExecuted», который проверяет, реализует ли модель представления интерфейс). – dahlbyk

Смежные вопросы