I would like to update the database when someone checked a box that represents a bit field on the row. I have been going off of this question: Ajax.ActionLink(...) with checkbox Here is my code in the cshtml file:
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Macro_Name)
</td>
<td>
@Html.CheckBoxFor(modelItem => item.Claimed, new { id = item.Macro_Name, data_url = Url.Action("ToggleClaim", "MacroStatus")})
</td>
<td>
@Html.DisplayFor(modelItem => item.Date_Claimed)
</td>
<td>
@Html.DisplayFor(modelItem => item.Username)
</td>
<td>
@Html.DisplayFor(modelItem => item.Finished)
</td>
<td>
@Html.DisplayFor(modelItem => item.Date_Completed)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Macro_Name }) |
@Html.ActionLink("Details", "Details", new { id = item.Macro_Name }) |
@Html.ActionLink("Delete", "Delete", new { id = item.Macro_Name })
</td>
</tr>
}
In the MacroStatusController class I have the following action:
public ActionResult ToggleClaim(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
MacroStatus macroStatus = db.MacroStatus1.Find(id);
if (macroStatus == null)
{
return HttpNotFound();
}
if (ModelState.IsValid)
{
macroStatus.Date_Claimed = DateTime.Now;
db.Entry(macroStatus).State = EntityState.Modified;
db.SaveChanges();
}
return new HttpStatusCodeResult(HttpStatusCode.OK);
}
However, ToggleClaim isn't running when I check or uncheck the box. There are no compile errors. This is my first try with asp.net mvc, what am I doing wrong?
You will need ajax for this. First, add a class to the checkboxes so you will have a hook to attach your click event.
@Html.CheckBoxFor(modelItem => item.Claimed, new { id = item.Macro_Name, @class = "toggle" data_url = Url.Action("ToggleClaim", "MacroStatus")})
Now add your javascript.
@section scripts {
<script>
$(function() {
$('.toggle').change(function() {
var self = $(this);
var url = self.data('url');
var id = self.attr('id');
var value = self.prop('checked');
$.ajax({
url: url,
data: { id: id },
type: 'POST',
success: function(response) {
alert(response);
}
});
});
});
</script>
}
The key point is sending an ajax request when checkbox changed.
As mentioned in comments by Eric, You can trigger that action using many different ways. for example, put this script in your codes:
<script>
$(function () {
$('#Claimed').change(function () {
$.ajax({
url: '/ToggleClaim/MacroStatus/@item.Macro_Name',
cache: false,
method: 'GET',
success: function (data) { alert('success'); },
error: function () { alert('error'); }
});
});
});
</script>
And correct checkbox code this way:
<td>
@Html.CheckBoxFor(modelItem => item.Claimed)
</td>
The above code, triggers the action each time you check or uncheck the checkbox, you can simply check if the checkbox is checked and then send ajax request.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With