MVC binding list of values to checkboxlist in an efficient way
In my opinion, your view is doing too much work. This is happening because your model is missing a property.

If you add an IsSelected property to your model, I think we can simplify the view a bit.

public class DeliveryAddress()
{
    public int ID { get; set; }
    public string Location { get; set; }
    public bool IsSelected { get; set; }
}


Now this single model contains all the information you need to bind to the view. You no longer even need the DeliveryAddressSelectionModel. The controller would look something like this (untested, I'm typing in the browser):

[HttpGet]
public ActionResult Edit()
{
    var selectedAddressIDs = new List&lt;int&gt;() { 1, 2, 4 };

    List&lt;DeliveryAddress&gt; model = AddressDetails.GetAvailable();

    foreach(var address in model.Where(a =&gt; selectedAddressIDs.Contains(a.ID)))
    {
        address.IsSelected = true;
    }

    return View(model);
}


Create a partial view for your DeliveryAddress.

@Model DeliveryAddress

@Html.CheckBoxFor(m =&gt; m.IsSelected)
@Html.LabelFor(m =&gt; m. Location)


Then, from your main view, render the partial view.

@Model System.Collections.Generic.List&lt;DeliveryAddress&gt;

&lt;form method="post"&gt;
    &lt;ul&gt;
        @foreach(var address in Model)
        {
          &lt;li&gt;
            @Html.RenderPartial("DeliveryAddress", address)    
          &lt;li /&gt;
        }
    &lt;ul /&gt;
    &lt;input type="submit" value="Save Address"/&gt;
&lt;/form&gt;