c# - PartialView 正在返回整页,仅呈现表单
问题描述
在 ajax 请求之后,我试图仅在我的模式中重新呈现部分视图。但是当我得到响应时,一切都会重新渲染,唯一显示的是部分视图..
部分视图:
@{
var bidModel = new BidModel();
}
<div>
<div class="row">
@if (ViewBag.Message != null)
{
<div class="alert alert-success">@ViewBag.Message</div>
}
</div>
<span class=" alert-danger">
@Html.ValidationSummary()
</span>
<div class="form-group">
<input name="Bidder" asp-for="@bidModel.Bidder" value="@User.Identity.Name" type="hidden" />
<input name="AuctionId" asp-for="@bidModel.AuctionId" type="hidden" id="auctionId" />
<label asp-for="@bidModel.Amount" />
<input name="Amount" asp-for="@bidModel.Amount" />
</div>
</div>
控制器:
public async Task<IActionResult> AddBid(BidModel Bid)
{
var result = await _bidBusinessInterface.CreateBidAsync(Bid, Bid.AuctionId);
if (result)
{
ViewBag.Message = "Bud lagt!";
}
else
{
ViewBag.Message = "Bud förlågt!";
}
return PartialView("_BidCreatorPartial");
}
然后我们有了我想重新渲染部分视图的模态:
<div class="modal fade" id="bidModal" tabindex="-1" role="dialog" aria-labelledby="bidModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="bidModalLabel">Lägg bud</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form asp-action="AddBid" asp-controller="Home" method="POST" data-ajax="true" data-ajax-update="frmBid">
<div id="frmBid">
<partial name="_BidCreatorPartial" model="@bidModel"/>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Avbryt</button>
<button type="submit" class="btn btn-primary">Spara</button>
</div>
</form>
</div>
</div>
</div>
</div>
正如我所说,我想要完成的是重新渲染表单,以便消息可以在模态中显示。
发生的情况是它呈现一个只有表单和消息的整个白页。
解决方案
您实际上并没有发布表单本身,但我最好的猜测是您只是在发布标准的旧 HTML 表单。这总是会导致页面发生变化,然后由于您只返回部分视图而不是完整视图,因此您的页面仅被该 HTML 片段替换。
你想要的需要 AJAX。您需要捕获表单上的提交事件,而不是像往常一样让它发生,而是使用序列化的表单数据发出 AJAX 请求。然后,在 AJAX 请求的成功回调中,您需要从 DOM 中查询要替换 HTML 的元素,并将其innerHTML
值更改为 AJAX 请求返回的值。
由于 ASP.NET Core 项目附带了开箱即用的 jQuery,我假设您可以使用它:
$('#MyForm').on('submit', function (e) {
e.preventDefault();
var $form = $(this);
$.ajax({
url: $form.attr('action'),
method: 'post',
data: $form.serialize(),
success: function (html) {
$('#frmBid').html(html);
}
});
});
推荐阅读
- django - 通过 DetailView 访问子模型?
- connection - 为气流连接配置角色
- ubuntu - Virt-manager 和几个通过 sendkey 的控制台
- php - CircleCI 不导入依赖项
- sql - TSQL:如何合并多个复杂的选择?
- c++ - 静态变量可以多次初始化吗?
- android - 如何为 kotlin 协程编写单元测试
- amazon-web-services - 如果需要白名单,我们是否应该将 AWS Lambda 保留在 VPC 中?
- reactjs - 在每次渲染时保持反应组件的状态
- java - spark与kafka的整合,Spark中的异常——提交一个jar