Сильно типизированный макет и строго типизированная страница, которая хочет его использовать - PullRequest
2 голосов
/ 10 августа 2011

У меня проблема с архитектурой и передачей моделей в моем приложении Asp.NET MVC ... Вот в чем дело.

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

Мой вопрос заключается в том, как решить эту проблему, например, с помощью другой конструкции, но, возможно, без удвоения кода.Создание ViewModel со всеми возможными моделями для страниц, которые использовали этот макет, не выглядит как вариант (даже если есть какой-то способ передать модель дальше в @RenderBody ()).

Мой код

Панель входа (частичное представление)

@model Models.Home.LoginModel
@{
    ViewBag.Title = "Login";
}
@using (Ajax.BeginForm(new AjaxOptions() { UpdateTargetId = "login" }))
{
    //some form fields here
}

Макет

@model Models.Home.LoginModel
<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <div id="login">
        @Html.Partial("Account/_Login", @Model)
    </div>
    <div id="main">
        @RenderBody()
    </div>
</body>

Страница

@model Models.Home.RegisterModel
@{
    ViewBag.Title = "Registration";
}
@using (Ajax.BeginForm(new AjaxOptions() { UpdateTargetId = "registerDialog" }))
{
    //some form fields here
}

Действие контроллера для входа в систему

[HttpPost]
public ActionResult Index(LoginModel model, string returnUrl)
{
    // If we got this far, something failed, redisplay form
    if (Request.IsAjaxRequest())
    {
        return PartialView("Account/_Login", model);
    }
    else
    {
        return View(model);
    }
}

Действие контроллера для регистра

[HttpPost]
public ActionResult Register(RegisterModel registerModel)
{
    return View(registerModel);
}

Я упростилвсе, удалив ненужные строки кода.

1 Ответ

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

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

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

Пример:

Контроллер

[ChildActionOnly]
public ActionResult Login() {
     LoginModel model;
     // do login check, set model
     return View("_Login", model);
}

Компоновка

<body>
<div class="header">@Html.Action("Login")</div>
@RenderBody()
</body>

_Login.cshtml

@model LoginModel
@if(Model.IsLoggedIn) {
    <text>Welcome @Model.UserName</text>
} else {
    .. do ajax form stuff here ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...