发布局部视图表格

时间:2018-04-17 02:08:11

标签: c# razor asp.net-core partial-views

有人可以帮助我理解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()。

任何指针?阅读了很多文章和论坛帖子,但没有明确的描述或演练来帮助我理解这一点,并从父视图回发部分视图操作方法。

1 个答案:

答案 0 :(得分:0)

这就是为什么Razor Pages是一个障碍:它们混淆了逻辑,允许人们在没有真正理解其中任何一个有效的情况下构建东西。 </rant>

部分视图没什么特别之处。它只是一个像任何其他视图一样的视图。使它“部分”的是它被使用的上下文,即将其注入到视图的渲染中。因此,Razor Pages允许您添加代码隐藏,因为它只是一个视图,任何视图都可以使用Razor Pages代码隐藏。但是,当像部分一样使用时,实际上没有使用代码隐藏,并且存在问题。

另外,您需要记住,部分视图的整个概念仅存在于服务器端。一旦返回响应,您所拥有的只是一个HTML文档。浏览器不关心您是使用一个局部视图,100个部分视图还是没有部分视图来创建响应服务器端。因此,使用partial不会以某种方式神奇地为您提供仅使用页面的单个部分的功能,这样当您发布时,只会更改该部分。为此,您需要AJAX。否则,无论是否从“部分视图”进行发布,都会导致在浏览器窗口中更改整个视图。

换句话说,你需要服务器端的东西,通过返回一个新的完整视图来响应该post请求,而不仅仅是你的部分,或者你需要通过AJAX在客户端发出请求,并返回你的部分视图。但是,您自己负责替换应该用该响应替换的任何HTML。