Skip to content

Instantly share code, notes, and snippets.

@dgg
dgg / gist:6387304
Created August 30, 2013 07:50
Model binding dynamic collections. III Ordering sortables
public static IEnumerable<T> Sort<T>(this IEnumerable<T> sortables) where T : IClientSortable
{
return sortables.EmptyIfNull()
.OrderBy(i => i.ClientOrder);
}
@dgg
dgg / gist:6388725
Created August 30, 2013 11:00
Model binding dynamic collections. IV DeletableThing
public interface IClientDeletable
{
bool ClientDeleted { get; set; }
}
public class DeletableThing : IClientDeletable
{
public string Text { get; set; }
public int Number { get; set; }
public bool IsEven { get; private set; }
@dgg
dgg / gist:6388731
Last active December 22, 2015 00:19
Model binding dynamic collections. IV DisplayTemplate for DeletableThing
@model DgonDotNet.Blog.Samples.DynamicCollections.Models.DeletableThing
<tr>
<td>
@Html.HiddenFor(m => m.ClientDeleted, new { @class = "data-delete" })
@Html.HiddenFor(m => m.Number)
@Html.DisplayFor(m => m.Number)
</td>
<td>
@Html.HiddenFor(m => m.Text)
@dgg
dgg / gist:6388754
Created August 30, 2013 11:05
Model binding dynamic collections. IV makeDeletable
DGON_DOTNET.ClientInteraction =
{
makeDeletable: function (tableSelector, options) {
options = optionsWithDefaults(options, {
deleteSelector: '.trash',
deletedSelector: '.data-delete',
});
$(tableSelector).delegate(
options.deleteSelector,
@dgg
dgg / gist:6388784
Created August 30, 2013 11:09
Model binding dynamic collections. IV DeleteController
[HttpPost]
public override ActionResult Index(string save, string discard, DeleteViewModel posted)
{
if (isSave(save, discard))
{
_repository.Save(DeletableThing.ToThings(posted.Things));
}
IEnumerable<Thing> updatedThings = _repository.Find();
var model = new DeleteViewModel
{
@dgg
dgg / gist:6388820
Created August 30, 2013 11:12
Model binding dynamic collections. IV Map non-deleted things
public static IEnumerable<Thing> ToThings(DeletableThing[] from)
{
return from
.NotDeleted()
.Select(st => st.ToThing());
}
@dgg
dgg / gist:6388831
Created August 30, 2013 11:13
Model binding dynamic collections. IV NotDeleted extension
public static IEnumerable<T> NotDeleted<T>(this IEnumerable<T> deletables) where T : IClientDeletable
{
return deletables.EmptyIfNull()
// ignore the ones deleted client-side
.Where(i => !i.ClientDeleted);
}
@dgg
dgg / gist:6388915
Created August 30, 2013 11:24
Model binding dynamic collections. IV deleteRow
function deleteRow(column, options) {
$(column).parents('tr')
.hide({
complete: function () {
var $row = $(this);
$row.find(options.deletedSelector).val(true);
}
});
}
@dgg
dgg / gist:6389532
Created August 30, 2013 12:53
Model binding dynamic collections. V AddableThing
public class AddableThing
{
public AddableThing() { }
public AddableThing(Thing from)
{
Number = from.Number;
Text = from.Text;
IsEven = (from.Number % 2) == 0;
}
@dgg
dgg / gist:6389606
Created August 30, 2013 13:01
Model binding dynamic collections. V template for new things
@model DgonDotNet.Blog.Samples.DynamicCollections.Models.AddViewModel
<script id="addable-template" type="text/x-handlebars-template">
<tr>
<td>
<div class="col-xs-4">
@(Html.Templated("{{NewIndex}}")
.TextBox(m => m.Things[0].Number, string.Empty, new { @class = "form-control input-sm" }))
</div>
</td>