модель частичной страницы в обработчике сообщений не выполняется | ASP.NET Core Razor Pages 2.0

У меня есть частичное представление с моделью страницы. В классе модели страницы у меня есть обработчик OnPost, который не вызывается при отправке формы.

_Subscribe.cshtml

@page
@model Shared._SubscribeModel

<div id="subscribe-for-updates">
    <h4>Subscribe to keep up-to-date with any changes.</h4>
    <form method="post">
        <input type="email" name="email" placeholder="[email protected]" />
        <input type="submit" value="Subscribe"/>
    </form>
</div>

_Subscribe.cshtml.cs

public class _SubscribeModel : PageModel
{
        public void OnGet()
        {

        }

        public async Task<IActionResult> OnPostAsync(string email)
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            await Task.Run(() =>
            {
                //do something
            });

            return RedirectToPage();
        }
}

Теперь частичное представление отображается на домашней странице.

Index.cshtml

@page
@model IndexModel
@{
    ViewData["Title"] = "Welcome";
}

<h2>Hello, Welcome to my website!</h2>

<partial name="_Subscribe" model="Model.SubscribeModel" />

Index.cshtml.cs

public class IndexModel : PageModel
    {
        public IndexModel()
        {
            SubscribeModel = new _SubscribeModel();
        }

        public _SubscribeModel SubscribeModel { get; }

        public void OnGet()
        {

        }
    }

Я провел небольшое исследование и обнаружил, что код, стоящий за частичными представлениями, не выполняется автоматически, как обычные страницы, что означает, что я должен явно вызывать OnPost, но это кажется неправильным.

Я делаю что-то неправильно?

Любая помощь будет оценена по достоинству.


person Community    schedule 17.07.2018    source источник
comment
Вы не используете контроллеры?   -  person JamesS    schedule 17.07.2018
comment
@JamesS MVC и контроллеры ушли в прошлое. Вы еще не слышали о Razor Pages? Он заменил MVC в качестве платформы для генерации HTML на стороне сервера, когда был выпущен ASP.NET Core 2.0.   -  person Mike Brind    schedule 17.07.2018


Ответы (1)


В частичных представлениях не должно быть файлов PageModel. По сути, это виджеты, которые отображаются на вызывающей странице и становятся ее частью. Ваш метод OnPostAsync должен быть добавлен в класс PageModel вызывающей страницы.

person Mike Brind    schedule 17.07.2018
comment
Большое спасибо за разъяснение. Я решил создать базовый класс абстрактной модели страницы, который наследуется от класса модели страницы по умолчанию, и все классы моей модели страницы наследуются от этой новой базы. Таким образом, я могу следовать принципу СУХОЙ. - person ; 20.07.2018
comment
@Mike Brind Я начинаю с Razor Pages с EF Core. Моей целью было бы поместить заголовок в частичное представление и в вызове layout.cshtml await Html.PartialAsync ( Header), однако заголовок частичного представления должен отображать данные, поступающие из базы данных. Я уже выполнил внедрение зависимостей DBContext, однако я не знаю, как лучше всего это сделать. Что вы предлагаете? - person Marcoscdoni; 24.08.2018
comment
@Marcoscdoni Используйте ViewComponent вместо Partial: learnrazorpages.com/razor-pages/view- компоненты - person Mike Brind; 25.08.2018