lovefaithswing
lovefaithswing

Reputation: 1540

mvc3 form for a IEnumerable

I have a model that I would like have a mass update page for, but am having trouble.

My ViewModel:

public class ApproveView
{

    public IEnumerable<MyObject> ObjectList { get; set; }

}

In my view I have:

foreach (var item in Model.ObjectList)
{
    <div>


    <table class="form" width="100%">
        <tr>

            <td>@Html.LabelFor(model => item.Accurate)<br />
            @Html.RadioButtonFor(model => item.Accurate, true) Yes
            @Html.RadioButtonFor(model => item.Accurate, false) No
            @Html.ValidationMessageFor(model => item.Accurate)
            </td>
            <td>
            @Html.LabelFor(model => item.Comments)<br />
            @Html.TextAreaFor(model => item.Comments)<br />
            @Html.ValidationMessageFor(model => item.Comments)
            </td>
        </tr>

    </table>

    @Html.HiddenFor(model => item.ID)
    @Html.HiddenFor(model => item.CreatedOn)
    @Html.HiddenFor(model => item.CreatedBy)
    @Html.HiddenFor(model => item.ModifiedOn)
    @Html.HiddenFor(model => item.ModifiedBy)
   <hr />
}

This loops over my objects and prints the form. The trouble is that all of the fields of the same type have the same name. So, for example, all of my radio buttons are connected and I can only select one.

how do I make the names for each field unique and associated with that object? Am I even on the right track or is there a better way to do this?

Upvotes: 7

Views: 4602

Answers (2)

Andrew Lewis
Andrew Lewis

Reputation: 5256

You could also do it a bit more manually:

    @{var count = 0;}
    @foreach (var item in Model.ObjectList){
            <div>
                <table class="form">
                    <tr>
                        <td>@Html.Label("Accurate" + count, item.Accurate)<br />
                            @Html.RadioButton("AccurateTrue" + count, true) Yes
                            @Html.RadioButton("AccurateFalse" + count, false) No
                            @Html.ValidationMessage("ValidationAccurate" + count, item.Accurate)
                        </td>
                        <td>
                            @Html.Label("CommentsLabel" + count, item.Comments)<br />
                            @Html.TextArea("Comments" + count, item.Comments)<br />
                            @Html.ValidationMessage("ValidationComment" + count, item.Comments)
                        </td>
                    </tr>
                </table>
                @Html.Hidden("ID" + count, item.ID)
                @Html.Hidden("CreatedOn" + count, item.CreatedOn)
                @Html.Hidden("CreatedBy" + count, item.CreatedBy)
                @Html.Hidden("ModifiedOn" + count, item.ModifiedOn)
                @Html.Hidden("ModifiedBy" + count, item.ModifiedBy)
                <hr />
                @count++; 
@}

Upvotes: 0

Samich
Samich

Reputation: 30095

Check this post: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

You need to create editor for your entity.

Hope it helps.

Upvotes: 4

Related Questions