Форма частичного просмотра
Может кто-нибудь помочь мне понять частичные взгляды, формы и публикации в 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-кода на этот ответ.