Understanding the ModelBinder
of ASP.NET MVC
Basically what the ModelBinder
does is try to reconcile the names and values of the fields of a form (in the case of POST) or a request (in the case of GET). Consider your example first:
<input type="hidden" name="teste">
<input type="hidden" name="teste" value="testes">
<input type="hidden" name="teste" value="testes1">
In this case, if the form was sent to a Controller
signed as follows:
public ActionResult MinhaAction(string[] teste) { ... }
The ModelBinder
would identify a name variable teste
with 3 values: empty, "testes"
and testes1
, and would correctly create a list for them as mentioned in the question.
The logic extends to any and all list, with the difference that in the form sufficient information is expressed so that the ModelBinder
can make the correspondence.
Suppose now that I want my method to now receive a complex object. Suppose the following ViewModel
:
public class MeuViewModel {
public String NomeProduto { get; set; }
public String NomeComprador { get; set; }
public int Quantidade { get; set; }
}
I can have a form like this:
<input type="hidden" name="meuViewModel.NomeProduto" value="Coca Cola">
<input type="hidden" name="meuViewModel.NomeComprador" value="Cigano">
<input type="hidden" name="meuViewModel.Quantidade" value="1">
Or simply:
<input type="hidden" name="NomeProduto" value="Coca Cola">
<input type="hidden" name="NomeComprador" value="Cigano">
<input type="hidden" name="Quantidade" value="1">
And a Action
signed with the following argument:
public ActionResult MinhaSegundaAction(MeuViewModel meuViewModel) { ... }
The ModelBinder
will fill in the information correctly.
Now, for complex object lists, you need to index. This can be done in two ways:
Basically, I can do this:
<input type="hidden" name="meuViewModel[0].NomeProduto" value="Coca Cola">
<input type="hidden" name="meuViewModel[0].NomeComprador" value="Cigano">
<input type="hidden" name="meuViewModel[0].Quantidade" value="1">
<input type="hidden" name="meuViewModel[1].NomeProduto" value="Guaraná">
<input type="hidden" name="meuViewModel[1].NomeComprador" value="Marlon">
<input type="hidden" name="meuViewModel[1].Quantidade" value="2">
<input type="hidden" name="meuViewModel[2].NomeProduto" value="Água Tônica">
<input type="hidden" name="meuViewModel[2].NomeComprador" value="Fulano">
<input type="hidden" name="meuViewModel[2].Quantidade" value="3">
The ModelBinder
is able to understand that this should become a list if the method is signed:
public ActionResult MaisUmaAction(List<MeuViewModel> meuViewModel) { ... }
But in the case of JSON?
Well, from the MVC3, a Action
can already receive JSON because the class JsonValueProviderFactory
, that feeds the ModelBinder
, already registered by default. That is, I can send the same form by Ajax as follows:
$.ajax({
url: '/MeuController/MaisUmaAction',
type: 'POST',
dataType: 'json',
data: [
{
"NomeProduto": "Coca Cola",
"NomeComprador": "Cigano",
"Quantidade": 1
},
{
"NomeProduto": "Coca Cola",
"Nome": "Marlon",
"Quantidade": 2
},
{
"NomeProduto": "Água Mineral",
"Nome": "Fulano",
"Quantidade": 3
}
],
contentType: 'application/json; charset=utf-8',
success: function (data) {
var message = data.Message;
$("#flash").html("Sucesso! " + message);
}
});
You will use lists of primitive variables or complex objects?
– Leonel Sanches da Silva
@Ciganomorrisonmendez actually wanted to learn from both.. What comes to help, is good size.
– Tiedt Tech