I have the following GUI for a simple inventory management application:
My problem is... The <tr> element's @Url.Action(...) is preventing the delete (trash) button from popping up a bootstrap modal. The page navigates away to the row items "Details" page. However, it appears the modal would popup if it didn't navigate away.
Table Row Markup:
<tr onclick="location.href = '@(Url.Action("Action", "Controller", new { id = item.ItemID }))'" class="inventory-row">
... <!-- Item Info -->
</tr>
Delete Button Markup:
@Html.ActionLink("<i class='fas fa-trash-alt'></i>", "#", null, new { @class = "btn btn-danger", @data_toggle = "modal", @data_target = "#DeleteConfirmationModal" })
Tried/Alt Delete Button Markup:
<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#DeleteConfirmationModal">
<i class="fas fa-pencil-alt"></i>
</button>
My goal is to popup a simple "Are you sure you want to delete item?" modal.
How can I get my delete button to popup the bootstrap modal while keeping the functionality that clicking on a table row goes to the items "Details" page?
I'd prefer to use razor syntax to accomplish this but you know the saying... at the end of the day I just need something that will work.
In the event it helps... this question is how I got the edit (pencil) button to function properly and this question is how I get the modal to pop up when the page doesn't navigate away.
EDIT:
I believe the edit (pencil) button only works because it navigates to the items edit page before the <tr> element has a chance to navigate to the details page. The delete (trash) button brings up a modal nested on the same page therefore allowing the <tr> element to navigate to the details page.
Do I need to reevaluate my interface design? or is it possible to have all but the last <td> element clickable effectively removing the conflict from the buttons?
EDIT 2:
Here is a link to the markup for the table: link
EDIT 3:
Delete method in controller:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
try
{
Item.RemoveItem(id);
return RedirectToAction("Index");
}
catch
{
return View();
}
}

Since the trash button is inside the
tr, one thing you can try is to handle the click event of the trash button itself and stop the event from propagating up. I'm assuming you are using bootstrap so the following solution is using jQuery. This should work for abuttonorActionLinkbut usually when you use an<a>, you want to use that anchor'shrefas the placeholder for thedata-target. I decided to use abutton. So in youhtmlIn your javascript:
Here is a demo:
https://www.bootply.com/paKZLt8L94
How to implement this in MVC
Add an anti-forgery token to your view (Replace
ControllerNamebelow with yourController)Add the modal markup somewhere in your view (at the end is ok)
Add the item ID as an
data-attributeto your buttons:Wrap your JavaScript in a Scripts block
Put the modified JavaScript code at the end of your view:
In your
_Layoutview you are rendering jQuery after is being used that's why none of the jQuery stuff was working. Push@RenderSection("scripts", required: false)to the end so that all the scripts in the layout get rendered before the scripts in each view. It's very important that you wrap the<script>...</script>in the Forklift index view in aScriptsblock (see above)Change
To