Форма частичного просмотра

Может кто-нибудь помочь мне понять частичные взгляды, формы и публикации в ASP.NET Core Razor.

У меня есть частичное представление Search.cshtml, расположенное в "~/Client/Search":

@model Web.Pages.Client.SearchModel

@using (Html.BeginForm())
{
    <div>
        @Html.RadioButtonFor(x => x.searchType, (int)ApplicationCore.Interfaces.SearchType.mobile, new { Name = "SearchType" }) Mobile
        @Html.RadioButtonFor(x => x.searchType, (int)ApplicationCore.Interfaces.SearchType.phone, new { Name = "SearchType" }) Phone
        @Html.RadioButtonFor(x => x.searchType, (int)ApplicationCore.Interfaces.SearchType.email, new { Name = "SearchType" }) Email
    </div>
    @Html.TextBoxFor(x => x.searchFilter)
    <input type="submit" value="Search"/>
}

С кодовой страницей Search.cshtml.cs:

 public class SearchModel : PageModel
    {
        public SearchType searchType { get; set; }
        public string searchFilter { get; set; }
        private readonly IClientService _clientService;
        private readonly Infrastructure.Data.DBContext _context;

        public SearchModel(Infrastructure.Data.DBContext context, IClientService clientService)
        {
            _context = context;
            _clientService = clientService;

            searchFilter = string.Empty;
            searchType = SearchType.mobile;
        }

        public async Task<IActionResult> OnPostAsync()
        {
            return RedirectToPage("./Index");
        }
    }

Если я загружаю частичное представление "~ / Client / Search" напрямую, оно загружается и при публикации корректно запускает действие OnPosAsync().

Однако если частичное представление "~ / Client / Search" отображается из родительского представления "~/Session/CheckIn":

@await Html.PartialAsync("~/Client/Search", Model._searchModel)

OnPostAsync() в частичном представлении "~ / Client / Search" больше не срабатывает.

Я перепробовал все виды комбинаций, чтобы определить "действие", "контроллер" в Html.BeginForm в частичном представлении, однако я никогда не могу запустить OnPostAsync() в частичном представлении.

Есть указатели? Прочитайте много статей и сообщений на форуме, однако нет четких описаний или пошаговых руководств, которые бы помогли мне понять это, и получить метод действия "Частичное представление", запускающий обратную передачу из родительского представления.

1 ответ

Вот почему Razor Pages - это упадок: они запутывают логику, позволяя людям создавать вещи, даже не понимая, как это работает. </rant>

В частичном представлении нет ничего особенного. Это просто вид, как и любой другой вид. То, что делает его "частичным", это контекст, в котором он используется, то есть внедряет его в рендеринг представления. Таким образом, Razor Pages позволяет добавлять код позади, потому что это просто представление, и любое представление может иметь код позади Razor Pages. Однако, когда используется как частичное, этот код на самом деле не используется, и есть ваша проблема.

Кроме того, вы должны иметь в виду, что вся концепция частичных представлений существует только на стороне сервера. Как только ответ был возвращен, все, что у вас есть, это просто HTML-документ. Браузер не заботился о том, использовали ли вы один частичный просмотр, 100 частичных просмотров или никаких частичных просмотров для создания ответа на стороне сервера. Таким образом, использование частичного не каким-то волшебным образом дает вам возможность просто работать с одним разделом вашей страницы, так что при публикации только этот раздел изменяется. Для этого вам нужен AJAX. В противном случае создание сообщения из "частичного представления" или без него приведет к изменению всего представления в окне браузера.

Другими словами, вам нужно что-то на стороне сервера, которое будет отвечать на этот пост-запрос, возвращая новый полный просмотр, а не только ваше частичное представление, или вам нужно сделать запрос на стороне клиента через AJAX и вернуть только ваше частичное представление. Тем не менее, вы сами несете ответственность за замену любого HTML-кода на этот ответ.

Другие вопросы по тегам