Brad, I use modals all the time, my clients love them. I set the list up with data-view and have the data-detail inside the form. This gives me the record ID as per the following
<input name="MailingID" type="hidden" id="mailingiddelete" dmx-bind:value="frmmailingdelete.detmailingdelete.data.MailingID">
This is the whole code where I have used the data-detail even outside of the form
<!-- Modal Mailing Delete -->
<div class="modal fade" id="mdlMailingDelete" tabindex="-1" role="dialog" aria-labelledby="mdlMailingDeleteLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="mdlMailingDeleteLabel">Delete: {{frmmailingdelete.detmailingdelete.data.MailingName}}</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 that you want to delete the following Mailing?</p>
<h4 class="well well-sm">{{frmmailingdelete.detmailingdelete.data.MailingSubject}} - <small>dated: {{frmmailingdelete.detmailingdelete.data.CreatedDateTime.formatDate("dd/MM/yyyy")}}</small></h4>
<div class="alert alert-danger" role="alert"><i class="fa fa-exclamation-triangle fa-2x" aria-hidden="true"></i> This action cannot be undone!</div>
</div>
<div class="modal-footer">
<form action="../dmxConnect/api/Admin/mailing/mailingdelete.php" method="post" id="frmmailingdelete" is="dmx-serverconnect-form" dmx-on:success="scmailinglist.load({})" onsuccess="$('#mdlMailingDelete').modal('hide')">
<dmx-data-detail id="detmailingdelete" dmx-bind:data="scmailinglist.data.qryMailingList" key="MailingID"></dmx-data-detail>
<input name="MailingID" type="hidden" id="mailingiddelete" dmx-bind:value="frmmailingdelete.detmailingdelete.data.MailingID">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-danger">Delete Mailing</button>
</form>
</div>
</div>
</div>
</div>
I hope this helps.