Here's my code:
Models
public class InformationsModel
{
public List<InformationModel> infos { get; set; }
public InformationsModel()
{
}
}
public class InformationModel
{
public InformationModel() {
}
public string Name { get; set; }
public string Value { get; set; }
public string Group { get; set; }
public string Type { get; set; }
public bool Avaiable { get; set; }
}
View
@model InterfaceWeb.Models.InformationsModel
@using (Html.BeginForm("UpdateInformations", "Main", FormMethod.Post, new { @id = "frmInformations" }))
{
@Html.EditorFor(x => x.infos)
}
Template
@model InterfaceWeb.Models.Information.InformationModel
<div class="infoMain">
<div class="colunas">
@Html.TextBoxFor(x => x.Name, new { style = "width:250px;" })
</div>
<div class="colunas">
@Html.TextBoxFor(x => x.Value, new { style = "width:120px;" })
</div>
<div class="colunas">
@Html.TextBoxFor(x => x.Group, new { style = "width:120px;" })
</div>
<div class="colunas">
@Html.TextBoxFor(x => x.Type, new { style = "width:150px;" })
</div>
<div class="colunas">
@Html.CheckBoxFor(x => x.Avaiable, new { style = "width:10px; margin-left:20px;" })
</div>
</div>
Controller
[HttpPost]
public ActionResult UpdateInformations(InformationsModel infos)
{
}
And when I reach the controller, my model is empty and I can't figure out why.
I tried to change the template, the view, initialize the list after, before, but nothing worked..
Thx for any help! =)
You're experiencing this problem because of the way model prefixes work. Specifically, the problem is here:
If you take a look at the HTML that your template generates, you'll see that it's along the lines of this:
In this case, the important thing to know is that
infos
is the prefix associated with the values of yourInformationsModel.infos
property. By also naming the parameter in your controllerinfos
, you're throwing off the model binder. You simply need to rename it to pick up the values, like so:As an aside, I'd recommend renaming
InformationModel
to something more suitable, likePerson
,Employee
or whatever it is you're modelling. It was a little difficult following what you were trying to do, just because the class names are almost identical and the names don't really convey their intent.Your problem is probably with naming of things :)
Change your controller:
With:
OR in your model change list name "infos" into something else.
Example:
Change with: