0

Я использую модальные данные для входа в систему и регистрации пользователя. Каждый модал строго типизирован, чтобы использовать встроенные классы учетных записей ASP.NET (RegisterModel и LoginModel). Однако, поскольку две кнопки для вызова этих модалов расположены на навигационной панели, а панель навигации помещается на каждую страницу, я получаю ошибки, потому что большинство представлений строго типизировано и, следовательно, не может обрабатывать частичное представление (модальное) для использования другой сильно типизированной модели ,Как обрабатывать строго типизированный модальный в строго типизированном виде с разными типами

Как строго типизированы модалы, обрабатываемые в строго типизированной среде?

_layout:

<body> 
<div class="navbar"> 
    @Html.Partial("_LoginPartial") // contains buttons to call login/register modals 
</div> 

<div> 
    @Html.Partial("_LoginModal") 
    @Html.Partial("_RegisterModal") 
</div> 

<div class="container"> 
    @Html.RenderBody() 
</div> 
</body> 

/Новости/Индекс:

@model List<NewsBulletinViewModel> 

LoginModal:

@model NoName.Models.LoginModel 

На соответствующую записку: Поскольку у меня есть формы в моих модальностей, как может Я возвращаюсь к тем модалям, когда возникают ошибки проверки? В идеале модальный должен всплывать снова (или никогда не закрываться) с показанными ошибками проверки.

+0

При вызове '_LoginModal' или' _RegisterModal' через '@ Html.Partial' почему вам необходимо пройти «Модель»? что бы это содержало? – haim770

+0

@ haim770: см. Мой комментарий к ответу Саймона. –

ответ

1

Есть перегрузка в @Html.Partial, которая берет объект, используемый для модели частичной страницы. Если вы включите Partial в свой макет, на каждой странице вам нужна логика для хранения этих данных. Например, если взять LoginModel и RegisterModel, вы можете сделать это:

@Html.Partial("_LoginPartial", ViewBag.LoginModel ?? new LoginModel()) 
@Html.Partial("_RegisterPartial", ViewBag.RegisterModel ?? new RegisterModel()) 

И оставить исполняющему роль контроллера поставить LoginModel (или RegisterModel). Если в файле ViewBag его нет, он будет возвращаться к созданию пустого.

Edit: на основе дополнительной информации, я бы это сделать для LoginPartial (RegisterPartial будет та же логика):

public class AccountController : Controller 
{ 
    public ActionResult LoginPartial() 
    { 
     return PartialView("_LoginPartial", (Session["Login"] as LoginModel) ?? new LoginModel()); 
    } 

    [HttpPost] 
    public HttpStatusCodeResult SaveLoginModel(LoginModel model) 
    { 
     Session["Login"] = model; 
     return new HttpStatusCodeResult(200); 
    } 
} 

А потом, в _LoginPartial, делать, как вы бы, но добавьте код javascript для отправки запроса ajax post в действие SaveLoginModel вашего контроллера, когда значение изменится, чтобы синхронизировать вашу модель (есть много информации о том, как это сделать).

Теперь, вместо того, чтобы делать:

@Html.Partial("_LoginPartial", ViewBag.LoginModel ?? new LoginModel()) 
@Html.Partial("_RegisterPartial", ViewBag.RegisterModel ?? new RegisterModel()) 

Вы бы:

@Html.Action("LoginPartial", "AccountController"); 
@Html.Action("RegisterPartial", "AccountController"); 
+0

Я использую модели соответствующего модального типа для создания полей ввода и выполнения проверки на нем, позволяя легко переносить введенные значения в 'AccountController'. Насколько мне известно, эти модальные модели могут быть пустыми при навигации по сайту, но они очень удобны, когда их действительно нужно использовать. Вы предлагаете сделать это по-другому? –

+0

Если я правильно понимаю, вы хотите отслеживать, что вводил пользователь, даже если он перемещает страницы.Вы можете это сделать, но не забывайте, что http не имеет гражданства, и если вы хотите отслеживать это, вам нужно регулярно пинговать ваш сервер, чтобы сохранить эти данные где-то (предположительно, в словаре сеансов). Я отредактирую свой ответ, чтобы предложить, что вы могли бы сделать, но я советую вам против этого. –

+0

Не нужно, ответ, который вы мне дали, уже исправляет его полностью, насколько я вижу! Мне просто нужно было найти способ отправить пустую модель в частичные просмотры, чтобы компилятор переставал сердиться, его модель отличается от основного вида. Мне пришлось немного изменить синтаксис, но решение, которое вы предоставили, похоже, делает трюк. –

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