У меня настроена веб-страница asp.net mvc. Все мои действия, такие как: создание, редактирование и т. д., имеют свои собственные представления, кроме удаления, потому что я пытаюсь открыть модальное окно с помощью Bootstrap. Я передаю идентификатор модальному модулю через jQuery/JavaScript и с asp-action в качестве атрибута формы, теоретически он должен работать, но это не так.
Представление индекса:
@if (Model.Tenants.Any())
{
<h3>Tenants (@Model.Tenants.Count)</h3>
<div class = "table-responsive">
<table class = "table table-striped table-sm">
<thead>
<tr>
<th></th>
<th>Name</th>
<th>Id</th>
<th>UrlFriendlyName</th>
<th>MicrosoftGraphTenantId</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var tenant in Model.Tenants.OrderByDescending(x => x.Name))
{
<tr>
<td>
<button class = "btn btn-primary" onclick = "document.location.href = '@Url.Action("Index", "User", new {id = tenant.Id})'">Show Users</button>
</td>
<td>
@tenant.Name
</td>
<td>
@tenant.Id
</td>
<td>
@tenant.UrlFriendlyName
</td>
<td>
@tenant.MicrosoftGraphTenantId
</td>
<td>
<div class = "btn-group-justified pull-right ">
<button class = "btn btn-success" onclick = "document.location.href = '@Url.Action("Edit", "Tenant", new {id = tenant.Id})'">Edit</button>
<button type = "button" class = "btn btn-danger" onclick = "deleteTenant('@tenant.Id', '@tenant.Name')" data-toggle = "modal" data-target = "#deleteModal">Delete</button>
</div>
</td>
</tr>
}
</tbody>
</table>
</div>
<div class = "align-items-sm-end">
<button onclick = "document.location.href='@Url.Action("Create", "Tenant")'" class = "btn btn-outline-success">Create new Tenant</button>
</div>
<div class = "modal fade" id = "deleteModal" data-backdrop = "static" data-keyboard = "false" tabindex = "-1" aria-labelledby = "staticBackdropLabel" aria-hidden = "true">
<div class = "modal-dialog modal-dialog-centered">
<div class = "modal-content">
<div class = "modal-header">
<h5 class = "modal-title"></h5>
<button type = "button" class = "close" data-dismiss = "modal" aria-label = "Close">
<span aria-hidden = "true">×</span>
</button>
</div>
<div class = "modal-body">
<p>Are you sure you want to delete the selected Tenant?</p>
</div>
<div class = "modal-footer">
<form asp-action = "Delete">
<input type = "hidden" id = "tenantidinput"/>
<button type = "submit" class = "btn btn-outline-danger">Delete Tenant</button>
</form>
<button type = "button" class = "btn btn-secondary" data-dismiss = "modal">Cancel</button>
</div>
</div>
</div>
</div>
}
Удалить действие в контроллере:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteAsync(Guid id)
{
if (ModelState.IsValid && id != Guid.Empty)
{
var tenant = await _context.Tenants.AsQueryable().Where(x => x.Id == id).FirstOrDefaultAsync().ConfigureAwait(false);
_context.Tenants.Remove(tenant);
await _context.SaveChangesAsync().ConfigureAwait(false);
}
return RedirectToAction("Index");
}
Javascript:
function deleteTenant(tenantid, tenantname) {
$(".modal-title").text("Delete " + tenantname);
$("#tenantidinput").attr("name", ''+tenantid+'');
}
Введите получение идентификатора в качестве значения имени:
При отладке он вообще не получает идентификатор:
Функция javascript получает параметры просто отлично. Я думаю, что проблема кроется в том, как форма передает id контроллеру. Он почему-то не передает значение атрибута имени.
Это происходит по двум причинам. Во-первых, скрытый input
должен иметь имя, совпадающее с аргументом в действии. В вашем случае id
:
<input type = "hidden" name = "id" id = "tenantidinput" />
Во-вторых, ваш JS должен устанавливать value
поля, а не его name
:
function deleteTenant(tenantid, tenantname) {
$(".modal-title").text("Delete " + tenantname);
$("#tenantidinput").val(tenantid);
}