Joseph Armbruster
Joseph Armbruster

Reputation: 71

MVC Model Class not populated on post

I have two MVC models that look like this:

public class OtherModel
{
   [Required]
   [Display(Name = "Another ID")]
   public int id{ get; set; }
}

public class MyModel
{
   [Required]
   [Display(Name = "ID")]
   public int id { get; set; }


   public PlayerModel otherModel = new OtherModel ();
}

My controller has an [HttpPost] action called USE that looks like this:

[HttpPost]
public ActionResult Use(MyModel myModel)
{
   /// myModel.otherModel.id is 0 here!!
}

This action takes in a MyModel. When my form is being posted, the otherModel variable contains a 0 for the id value. Now, the view that contains the form is handed a MyModel and actually displays the otherModel.id on the page. The problem is the post action is not properly marshalling the form data into the otherModel object and I have no clue why.

Another note: When I examine the form data headers for the post, I clearly see otherModel.id with the value that I expect.

Why is this data not appearing correctly within my otherModel object?

Thank You in advance!

Upvotes: 3

Views: 2322

Answers (3)

sirenyard
sirenyard

Reputation: 1

I had an almost identical issue. The fix for me was as Matt mentioned, to make the inner object a property with the needed accessors.

public class OuterModel 
{
    public OuterModel ()
    {
        AuxData= new InnerModel();
    }
    public InnerModel AuxData{ get; set; }
}

public class InnerModel
{
     Int Id {get; set;}
}

Upvotes: 0

Matt Hamsmith
Matt Hamsmith

Reputation: 4036

Instead of initializing otherModel with a new object at the line PlayerModel otherModel = new OtherModel();, use a property public PlayerModel otherModel { get; set; }. otherModel needs a property setter for the model binder to assign the value properly. This may require you to also change how you populate the otherModel property when displaying the view - construct an object and assign it explicitly in either the displaying controller method or some other function that hydrates the model.

Upvotes: 0

Eugeniu Torica
Eugeniu Torica

Reputation: 7574

Did you registered binder in Global.asax.cs?

public static void RegisterBinders(ModelBinderDictionary binders)
{
   binders.Add(typeof(MyModel), new MyModelBinder());
   // other binders
}

This is called in Application_Start like the following:

protected void Application_Start()
{
   RegisterBinders(ModelBinders.Binders);
}

PS: I assumed you are using a custom model binder. In case you are using automatic binding see if you respect the naming conventions.

Upvotes: 1

Related Questions