I am looking to open and populate a Bootstrap modal, based on the row selected from my HTML table and the data I have got from my model, I have a button within my HTML table that will call a JS function and pass the ID to it. I am able to get the data back, but I just don't know how to populate the model with the JSON list.
This is my modal I want to build dynamically:
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Change User Deparment</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form>
<div class="form-group">
<label for="Employee Number" class="form-control-label">Employee Number:</label>
<input type="text" class="form-control" id="Employee Number">
</div>
<div class="form-group">
<label for="userName" class="form-control-label">User Name:</label>
<input type="text" class="form-control" id="userName">
</div>
<label for="department">Select Department</label>
<select class="form-control" id="department">
<option>Option1</option>
<option>Option2</option>
<option>Option3</option>
</select>
</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">Send message</button>
</div>
</div>
</div>
</div>
This My JS function, to get my data from my model.
function editUser(id) {
//alert(userId);
$.ajax({
type: "GET",
url: '@Url.Action("GetUserDetails", "Admin")',
contentType: "application/json; charset=utf-8",
datatype: JSON,
data: ({ 'Value': id }),
success: function () {
},
error: function () {
alert(test);
}
});
}
First, you might want to assign names to your input fields in the form in the modal:
<div class="modal-body">
<form>
<div class="form-group">
<label for="Employee Number" class="form-control-label">Employee Number:</label>
<input type="text" class="form-control" name="EmployeeNumber" id="Employee Number">
</div>
<div class="form-group">
<label for="userName" class="form-control-label">User Name:</label>
<input type="text" class="form-control" name="UserName" id="userName">
</div>
<label for="department">Select Department</label>
<select class="form-control" id="department">
<option>Option1</option>
<option>Option2</option>
<option>Option3</option>
</select>
</form>
</div>
Then, use jQuery to assign the values based on the names. This may be different based on what your data looks like. Should be something like this:
$.ajax({
type: "GET",
url: '@Url.Action("GetUserDetails", "Admin")',
contentType: "application/json; charset=utf-8",
datatype: JSON,
data: ({ 'Value': id }),
success: function (result) {
$('#exampleModal form input[name=EmployeeNumber]').val(result.EmployeeNumber);
$('#exampleModal form input[name=UserName]').val(result.UserName);
},
error: function () {
alert(test);
}
});
I would like to suggest you to load a view inside your modal content, e.g.:
function editUser(id) {
//alert(userId);
var $modal = $("#exampleModal");
$modal.find('.modal-body').load('@Url.Action("GetUserDetails", "Admin")/' + id, function() {
$modal.modal('show');
});
}
And in your controller, you get the model data and return it's view, e.g:
public ActionResult GetUserDetails(long id) {
UserDetailsViewModel model = GetModel(id); // Get the model somehow
return PartialView(model);
}
And a view called GetUserDetails, e.g:
@model UserDetailsViewModel
<form>
<div class="form-group">
@Html.LabelFor(model => model.EmployeeNumber)
@Html.EditorFor(model => model.EmployeeNumber, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(model => model.UserName)
@Html.EditorFor(model => model.UserName, new { @class = "form-control" })
</div>
<label for="department">Select Department</label>
<select class="form-control" id="department">
<option>Option1</option>
<option>Option2</option>
<option>Option3</option>
</select>
</form>
IMO it's the most elegant and clear way to do it.