Могу ли я иметь частичное представление, которое использует две модели? - PullRequest
2 голосов
/ 09 августа 2011

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

  • Когда пользователь не вошел в систему, показать регистрационную форму.

  • Когда пользователь вошел в систему, покажите мне информацию о пользователях.

У меня есть частичное представление, которое действует как как форма регистрации, так и информационная карточка пользователя; в зависимости от того, вошел ли пользователь в систему.

Поскольку это частичное представление должно быть видно из любой точки веб-сайта, я написал его в области _layout приложения MVC3:

<body>
    <div id="wrapper">

        <div id="top">
            <p id="onlinecount">7890 Personas Jugando</p>
            <p id="logoncontrol">ENTRAR | REGISTRARSE</p>
        </div>

        <div id="headercontainer">
            <img src="../../Content/Images/topheadertemp.png" />
        </div>

        <div id="middle">
            <div id="playerinformation">
                @Html.Partial("_RegisterPartial") <!-- HERE! -->
            </div>            

            <div id="centerad">
                <img src="../../Content/Images/premio.png" />
            </div>

            <div id="rightad">
                <img src="../../Content/Images/ganadores.png" />
            </div>

            <div class="clear"></div>
        </div>

        <div id="bottom">@RenderBody()
        </div>

    </div>
</body>

По сути, мне нужно показать форму в этой части, если пользователь не вошел в систему. Однако, если он вошел в систему (через cookie или что-то еще), я должен загрузить модель его информации, чтобы отобразить данные для его учетной записи.

Вот где я застрял. Я не знаю, как загрузить модель для этого использования. Так как это в _layout, никакой контроллер не действует на него, если я прав, нет?

Есть предложения?

Ответы [ 4 ]

10 голосов
/ 09 августа 2011

Вы должны посмотреть на этот предыдущий вопрос , который похож на ваш.

Вы должны иметь регистрацию и информацию о пользователе в одной модели для вашей страницы.(Таким образом, ответ на ваш вопрос состоит в том, что ваша страница имеет только одну модель. Но ваша модель может состоять из других объектов - по одному для каждого частичного представления.)

Итак, как вы видите в ссылке,пользователь имел частичные представления, которые используют только те объекты в модели страницы, которая к нему относится.

Я думаю, что это должно помочь вам.Надеюсь это поможет!Удачи.

ОБНОВЛЕНИЕ : Извините за задержку, но вот пример (много кода), который может помочь:

Модель : Iсоздайте модель абстрактного представления, в которой всегда есть данные reg и user.Модель каждой страницы может наследоваться от этого резюме.

public class Registration
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

public class UserData
{
    public string DisplayName { get; set; }
    public int Age { get; set; }
}

public abstract class RegModelViewModelBase
{
    public string Title { get; set; }
    public Registration RegInfo { get; set; }
    public UserData UserInfo { get; set; }
}

public class MainPageViewModel : RegModelViewModelBase
{
}

Контроллер : Здесь я просто создаю конкретную модель представления для этой страницы / представления (MainPageViewModel).Я устанавливаю свойства (которые могут исходить из базы данных и т. Д.).Я передаю модель представления в представление.

public class HomeController : Controller
{
    public ActionResult Index()
    {
        MainPageViewModel hpvm = new MainPageViewModel();

        hpvm.Title = "Some Cool Page";
        hpvm.RegInfo = new Registration() { Password = "blah", UserName = "dhoerster" };
        hpvm.UserInfo = new UserData() { DisplayName = "David Hoerster", Age = 125 };

        return View(hpvm);
    }
}

View - _Layout.cshtml: обратите внимание, что первая строка в моей модели устанавливает объект модели для моего шаблона _layout.Я получаю эту модель представления из контроллера и могу ссылаться на нее в _layout (или другом шаблоне).Здесь я ничего не делаю, за исключением получения частичного представления (_RegStuff) и передачи ему моего RegInfo из моей модели (которая была установлена ​​в контроллере):

@model MvcApplication1.Models.RegModelViewModelBase

<!DOCTYPE html>
<html>
<head>
    <title>@Model.Title</title>
</head>

<body>
    @Html.Partial("_RegStuff", Model.RegInfo)
    @RenderBody()
</body>
</html>

View - _RegInfo.cshtml: Грязь простая, но опять же я установил тип модели, в которой ожидается частичное представление.

@model MvcApplication1.Models.Registration
<div>User Name = @Model.UserName</div>

Представление - Index.cshtml: сноваустановите модель и используйте ее в моем индексном представлении.

@model MvcApplication1.Models.MainPageViewModel

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>@Model.Title</h2>
<h3>Display Name = @Model.UserInfo.DisplayName</h3>

Итак, я могу ссылаться на набор моделей в моем контроллере.

Надеюсь, это объясняет, к чему я стремился,Если нет, я могу обновить это соответственно.

Спасибо!

0 голосов
/ 09 августа 2011

Я собираюсь пойти против зерна здесь и рекомендую, чтобы вы не приняли это решение в поле зрения.Имейте два отдельных представления со своими собственными моделями и позвольте контроллеру определять, какое представление вызывается, в зависимости от того, вошел ли пользователь в систему (аутентифицирован) или нет.

Это не тот подход, который вы ищетеЭто невозможно сделать ... Вы можете легко сделать это, создав модель представления, состоящую из каждой модели представления, которая вам нужна.Я все еще советую против этого все же.

0 голосов
/ 09 августа 2011

Вы можете создать новый класс "ViewModel" для обеих моделей,
Или вы можете поместить обе или одну из моделей в ViewBag

0 голосов
/ 09 августа 2011

Один из способов сделать это - создать ViewModel следующим образом:

public class ViewModel
{
    public PlayerCard playerCard { get; set; }
    public RegisterModel registerModel { get; set; }
}

Чтобы включить обе модели.

...