【问题标题】:Post partial view form发布部分视图表单
【发布时间】:2018-09-26 20:54:02
【问题描述】:

谁能帮我理解 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() 不再触发。

我已经尝试了各种组合来定义部分视图中的 Html.BeginForm 中的“动作”、“控制器”,但是我永远无法触发部分视图中的 OnPostAsync()。

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

【问题讨论】:

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


    【解决方案1】:

    这就是为什么 Razor Pages 很糟糕的原因:它们混淆了逻辑,允许人们在没有真正理解其中任何工作原理的情况下构建东西。 &lt;/rant&gt;

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

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

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

    【讨论】:

    • 嗨,克里斯,感谢您的回复。那么你是说只有页面视图中的处理程序在 Post 或 AJAX Get 上执行?并且不能执行部分视图中的处理程序?
    • 是的。您基本上需要像不存在的部分 Razor Page 之类的东西。部分视图只是视图。
    猜你喜欢
    • 2018-01-27
    • 2018-06-30
    • 2012-05-23
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多