Как создать общую форму в ASP.NET CORE Razor Pages? - PullRequest
0 голосов
/ 01 ноября 2018

Мне нужно создать форму многократного использования в заголовке моей страницы. Это должно отображаться на каждой странице. Простая кнопка ввода и отправки, которая отправит запрос POST.

Опции, о которых я знаю, являются частичными представлениями или компонентами представления. Я проверил документацию о компонентах представления, но нет никаких упоминаний, что это работает с формами. Для инициализации представления доступен только метод InvokeAsync.

При частичном просмотре может быть сложно определить модель страницы, и я не понимаю, куда поместить обработчик POST.

Я вижу еще один вариант - как-то разместить форму прямо на _Layout.cshtml, но, опять же, у нее нет модели страницы (afaik),

Так, как создать общую форму и где должен обрабатываться запрос POST?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

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

public class SharedFormViewComponent : ViewComponent
{
    public Task<IViewComponentResult> InvokeAsync() =>
        Task.FromResult(View(new SharedFormViewModel()));
}

Затем введите HTML-код вашей формы в Views\Shared\Components\SharedForm\Default.cshtml. Для действия вашей формы вам нужно будет указать маршрут. Подробнее об этом в с. Затем для отображения вашей формы:

@await Component.InvokeAsync("SharedForm")

Теперь, как вы уже заметили, компоненты представления нельзя публиковать. Это не проблема «не поддерживающих форм»; они буквально не являются частью конвейера запросов и поэтому не могут отвечать на запросы, такие как POST. Вам понадобится отдельное действие, которое будет обрабатывать POST на некотором контроллере. Затем в теге формы вашего компонента:

<form asp-action="SharedFormHandlerAction" asp-controller="Foo" asp-area="" method="post">

Атрибут asp-area должен быть предоставлен на случай, если он используется в контексте различных областей.

Вам также понадобится «обратный URL». Это будет URL-адрес текущей страницы, поэтому после того, как пользователь успешно отправит форму, он вернется на страницу, с которой отправил ее. Вы можете достичь этого, добавив скрытый ввод в форму:

<input type="hidden" name="returnUrl" value="@(Context.Request.Query["returnUrl"].FirstOrDefault() ?? (Context.Request.Path + Context.Request.QueryString))" />

В этом случае ваш обработчик должен принимать такой параметр, как string returnUrl = null, и в случае успеха вы должны выполнить:

return !string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl)
    ? Redirect(returnUrl)
    : RedirectToAction("SomeDefaultAction");

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

<partial name="~\Views\Shared\Components\SharedForm\Default.cshtml" />
0 голосов
/ 01 ноября 2018

Если вы хотите использовать PageModel, вы можете сделать это в классе BasePageModel, который наследуется от PageModel и от которого наследуются все ваши страницы. Вы можете использовать именованный обработчик (https://www.learnrazorpages.com/razor-pages/handler-methods#named-handler-methods) в классе BasePageModel для обработки отправки формы. Добавьте форму непосредственно в макет, для чего потребуется директива @model для вашего типа BasePageModel.

public class BasePageModel : PageModel
{
    [BindProperty]
    public string SearchString { get; set; }

    public void  OnPostBaseSearch()
    {
        // process the search
    }
}
...