sameh.q
sameh.q

Reputation: 1709

MVC Binding complex objects with list of values

I have looked at most of the available help in SO and google related to this but I'm not sure what I'm doing wrong.

I have Model with some properties, and one of the properties is a list of another complex object. I'm not able to bind this list!

Pleas help!

Here is my Model classes related:

public class PrivacyModel
{
        public int RatingId { get; set; }
        public List<RatingPoint> RatingPoints { get; set; }
}

public class RatingPoint
{
        public int RatingItemId { get; set; }
        public string RatingValue { get; set; }
}

Here is my code:

 [HttpPost]
 public ActionResult Index(PrivacyModel model)
 {
     .... my business logic....
 }

My view looks like this:

    @using (Html.BeginForm("Index", "Privacy"))
        {

            <input type="hidden" name="RatingId" value="@Model.RatingId" />

            for (var i = 0; i < Model.RatingPoints.Count; i++)
            {

                var ratingPoint = Model.RatingPoints[i];

                <input type="hidden" name="PrivacyModel.RatingPoints[@i].RatingItemId" value="@ratingPoint.RatingItemId" />

                <input type="hidden" name="PrivacyModel.RatingPoints[@i].RatingValue" @("id=RatingPoints" + ratingPoint.RatingItemId) value="@ratingPoint.RatingValue" />
            }
       <input class="btn" type="submit" value="Submit" />
     }

Please don't mind the value and id fields, they are being updated by jQuery somewhere in my page correctly.

This got me a null list of RatingPoints in my action

I have tried also without the prefix PrivacyModel in PrivacyModel.RatingPoints[@i]., but this got me an empty list of RatingPoints in my action

I have also tried using an Index like in the suggested solution here for non-sequential items

Upvotes: 1

Views: 2907

Answers (1)

Ehsan Sajjad
Ehsan Sajjad

Reputation: 62498

You are making it complex yourself, you can just use HiddenFor() helper for this:

for (var i = 0; i < Model.RatingPoints.Count; i++)
{


  @Html.HiddenFor(x=> Model.RatingPoints[i].RatingItemId)
  @Html.HiddenFor(x=> Model.RatingPoints[i].RatingValue,new { id= "RatingPoints"+Model.RatingPoints[i].RatingItemId})      

 }

and this will render the same html, and values will be correctly binded in Model at post.

Upvotes: 3

Related Questions