有人可以帮助我理解ASP.NET Core Razor中的部分视图,表单和发布。
我在“〜/ Client / Search”中有一个Search.cshtml局部视图:
@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)
“〜/ Client / Search”部分视图中的OnPostAsync()不再触发。
我已经尝试了各种组合来在Partial View中的Html.BeginForm中定义“action”,“controller”,但是我永远无法在Partial View中触发OnPostAsync()。
任何指针?阅读了很多文章和论坛帖子,但没有明确的描述或演练来帮助我理解这一点,并从父视图回发部分视图操作方法。
答案 0 :(得分:0)
这就是为什么Razor Pages是一个障碍:它们混淆了逻辑,允许人们在没有真正理解其中任何一个有效的情况下构建东西。 </rant>
部分视图没什么特别之处。它只是一个像任何其他视图一样的视图。使它“部分”的是它被使用的上下文,即将其注入到视图的渲染中。因此,Razor Pages允许您添加代码隐藏,因为它只是一个视图,任何视图都可以使用Razor Pages代码隐藏。但是,当像部分一样使用时,实际上没有使用代码隐藏,并且存在问题。
另外,您需要记住,部分视图的整个概念仅存在于服务器端。一旦返回响应,您所拥有的只是一个HTML文档。浏览器不关心您是使用一个局部视图,100个部分视图还是没有部分视图来创建响应服务器端。因此,使用partial不会以某种方式神奇地为您提供仅使用页面的单个部分的功能,这样当您发布时,只会更改该部分。为此,您需要AJAX。否则,无论是否从“部分视图”进行发布,都会导致在浏览器窗口中更改整个视图。
换句话说,你需要服务器端的东西,通过返回一个新的完整视图来响应该post请求,而不仅仅是你的部分,或者你需要通过AJAX在客户端发出请求,并返回你的部分视图。但是,您自己负责替换应该用该响应替换的任何HTML。