I'm using bootstrap on my Table and Datatables.net to integrate searching and paging as well. The problem is that only the current page of the Table was retained on the Model after clicking the submit button.
Without integrating searching and paging via Datatables.net, there were no errors only when Datatables.net plugin was used.
Model:
public class SampleViewModel
{
public List<CollectionViewModel> Collection { get; set; }
}
public class CollectionViewModel
{
public string Name { get; set; }
public int? Value { get; set; }
}
Controller:
public ActionResult Sample()
{
SampleViewModel model = new SampleViewModel();
model.Collection = new List<CollectionViewModel>();
model.Collection.Add(new CollectionViewModel { Name = "Test1" });
model.Collection.Add(new CollectionViewModel { Name = "Test2" });
model.Collection.Add(new CollectionViewModel { Name = "Test3" });
model.Collection.Add(new CollectionViewModel { Name = "Test4" });
model.Collection.Add(new CollectionViewModel { Name = "Test5" });
model.Collection.Add(new CollectionViewModel { Name = "Test6" });
model.Collection.Add(new CollectionViewModel { Name = "Test7" });
model.Collection.Add(new CollectionViewModel { Name = "Test8" });
model.Collection.Add(new CollectionViewModel { Name = "Test9" });
model.Collection.Add(new CollectionViewModel { Name = "Test10" });
model.Collection.Add(new CollectionViewModel { Name = "Test11" });
model.Collection.Add(new CollectionViewModel { Name = "Test12" });
model.Collection.Add(new CollectionViewModel { Name = "Test13" });
model.Collection.Add(new CollectionViewModel { Name = "Test14" });
model.Collection.Add(new CollectionViewModel { Name = "Test15" });
return View(model);
}
[HttpPost]
public ActionResult Sample(SampleViewModel model)
{
var ctr = model.Collection.Count(x => x.Value != null);
return View(model);
}
View:
@model MyApp.Models.SampleViewModel
@using (Html.BeginForm())
{
<div class="dataTable_wrapper">
<div class="pull-right">
<button type="submit" name="submitButton" class="btn btn-primary btn-sm">
<i class="fa fa-floppy-o fa-1x"></i>
Submit
</button>
</div><br /><hr />
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>Name</th>
<th>Value</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.Collection.Count(); ++i)
{
@Html.HiddenFor(model => model.Collection[i].Name)
<tr>
<td>@Html.DisplayFor(model => model.Collection[i].Name)</td>
<td>
@Html.TextBoxFor(model => model.Collection[i].Value, new { @class = "form-control" })
</td>
</tr>
}
</tbody>
</table>
</div>
}
Before Submit:
After Submit Button Clicked:
You can see on the above picture that instead of 15 records, only 10 records was stored on the model.
When using DataTables plug-in with pagination only current page <tr>
elements (10
in your example) exist in the DOM for performance. Therefore when you submit the form, only current page form controls values are being submitted.
The trick is to turn form elements from pages other than current into <input type="hidden">
before submitting the form.
var table = $('#example').DataTable();
// Handle form submission event
$('#frm-example').on('submit', function(e){
var form = this;
// Encode a set of form elements from all pages as an array of names and values
var params = table.$('input,select,textarea').serializeArray();
// Iterate over all form elements
$.each(params, function(){
// If element doesn't exist in DOM
if(!$.contains(document, form[this.name])){
// Create a hidden element
$(form).append(
$('<input>')
.attr('type', 'hidden')
.attr('name', this.name)
.val(this.value)
);
}
});
});
See this example for code and demonstration.
Another solution is to submit the form via Ajax.
var table = $('#example').DataTable();
// Handle form submission event
$('#frm-example').on('submit', function(e){
// Prevent actual form submission
e.preventDefault();
// Serialize form data
var data = table.$('input,select,textarea').serialize();
// Submit form data via Ajax
$.ajax({
url: '/echo/jsonp/',
data: data,
success: function(data){
console.log('Server response', data);
}
});
});
See this example for code and demonstration.
Please note that both solutions will work in client-side processing mode only.
See jQuery DataTables: How to submit all pages form data for more details.
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