ci*_*ess 1 .net javascript ajax jquery asp.net-core
我是 .NET 新手,我想打开一个模式弹出窗口,然后将此数据保存到数据库而不重新加载页面。
首先,用户需要单击一个按钮。Modal是通过ajax加载的。用户填写表格,然后内容经过验证并发布到数据库中。
这是按钮的代码:
<button class="btn btn-primary" asp-controller="Positions" asp-action="Create"
data-toggle="ajax-modal" data-target="#add-contact">Add new Positions</button>
Run Code Online (Sandbox Code Playgroud)
这是控制器:
// GET: Positions/Create
public IActionResult Create()
{
return View();
}
// POST: Positions/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("PositionId,PositionName")] Position position)
{
if (ModelState.IsValid)
{
_context.Add(position);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(position);
}
Run Code Online (Sandbox Code Playgroud)
这是模型(很简单)
public class Position
{
[Key]
public int PositionId { get; set; }
public string PositionName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的观点的代码:
@model Models.Position
@{
ViewData["Title"] = "Create";
}
<h3>Create Position</h3>
<hr/>
<div class="modal fade" id="add-contact" tabindex="-1" role="dialog" aria-labelledby="addPositionsLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="addPositionsLabel">Add positions</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="Create">
<input name="IsValid" type="hidden" value="@ViewData.ModelState.IsValid.ToString()" />
<div class="form-group">
<label asp-for="PositionName"></label>
<input asp-for="PositionName" class="form-control" />
<span asp-validation-for="PositionName" class="text-danger"></span>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" data-save="modal">Save</button>
</div>
</div>
</div>
</div>
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
Run Code Online (Sandbox Code Playgroud)
如何正确打开此弹出对话框窗口,然后将填充的行保存到数据库(通过ajax)而不重新加载页面?
为了防止向数据库添加数据时引用页面,您需要使用ajax来显示模态并将数据传递给Create方法。
并且还需要将需要刷新的数据内容(部分,而不是整个页面)放入到页面中,以partial view保证页面不会刷新,并且可以看到页面中添加的最新数据。
索引.cshtml:
@model IEnumerable<Models.Position>
@{
ViewData["Title"] = "Index";
}
@section Scripts{
<script type="text/javascript">
$("#addBtn").click(function () {
$.ajax({
url: $(this).attr("formaction"),
}).done(function (msg) {
$("#AddContent").html(msg);
$("#add-contact").modal("show");
})
});
$("body").on("click", "#save", function () {
var form = $('form');
var token = $('input[name="__RequestVerificationToken"]', form).val();
$.ajax({
type: "post",
url: form.attr('action'),
data: {
__RequestVerificationToken: token,
position: {
PositionName: $("#PositionName").val()
}
},
dataType: "html",
success: function (result) {
$("#add-contact").modal("hide");
$("#partial").html(result);
}
});
return false;
});
</script>
}
<button class="btn btn-primary" asp-controller="Positions" asp-action="Create"
data-toggle="ajax-modal" data-target="#add-contact" id="addBtn">
Add new Positions
</button>
<br />
<div class="modal fade" id="add-contact" tabindex="-1" role="dialog" aria-labelledby="addPositionsLabel" aria-hidden="true">
<div id="AddContent">
</div>
</div>
<div id="partial">
@Html.Partial("_PositionList", Model)
</div>Run Code Online (Sandbox Code Playgroud)
创建.cshtml:
@model Models.Position
@{
ViewData["Title"] = "Create";
Layout = null;
}
<h3>Create Position</h3>
<hr />
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="addPositionsLabel">Add positions</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="Create">
<input name="IsValid" type="hidden" value="@ViewData.ModelState.IsValid.ToString()" />
<div class="form-group">
<label asp-for="PositionName"></label>
<input asp-for="PositionName" class="form-control" />
<span asp-validation-for="PositionName" class="text-danger"></span>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" data-save="modal" id="save">Save</button>
</div>
</div>
</div> Run Code Online (Sandbox Code Playgroud)
_PositionList.cshtml(部分视图):
@model IEnumerable<Models.Position>
<table class="table-bordered">
<tr>
<th>
PositionId
</th>
<th>
PositionName
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@item.PositionId
</td>
<td>
@item.PositionName
</td>
</tr>
}
</table>Run Code Online (Sandbox Code Playgroud)
PositionsController.cs:
public IActionResult Index()
{
return View( _context.Position.ToList());
}
public IActionResult Create()
{
return View();
}
// POST: Positions/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("PositionId,PositionName")] Position position)
{
if (ModelState.IsValid)
{
_context.Add(position);
await _context.SaveChangesAsync();
return PartialView("_PositionList", _context.Position.ToList());
}
return View(position);
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
| 归档时间: |
|
| 查看次数: |
13316 次 |
| 最近记录: |