2017-09-18 3 views
-1

Disons que je ces modèles:modèle de liaison ASP.NET MVC

public class FilterModel 
{ 
    FilterPersonModel Person { get; set; } 

    FilterJobModel Job { get; set; } 
} 

public class FilterPersonModel 
{ 
    public string Name { get; set; } 

    public int Age { get; set; } 
} 

public class FilterJobModel 
{ 
    public string CompanyName { get; set; } 

    public string JobTitle { get; set; } 
} 

Et je les actions suivantes:

public ActionResult Search(FilterModel model) 
{ 
     //TODO 
} 

Et enfin mon action est appelée avec l'adresse suivante: http://mysite/myController/Search?Name=Bob&Age=32&CompanyName=Amazon&JobTitle=Developer

Lorsque je débogue, mon modèle est null, les propriétés Personne et Travail ne sont pas reconnues. Sans rien changer, dois-je créer un classeur modèle ou existe-t-il une autre solution? Si oui, lequel?

+0

indiquer le code qui a été utilisé pour construire l'URL – Praveen

+0

Il doit être '.../Recherche Person.Name = Bob & Person.Age = 32 & Job?. CompanyName = Amazon & ... ' –

+0

Comme je l'ai dit dans mon message, rien ne doit changer (url, modèles, action) –

Répondre

2

Ce que vous demandez n'est pas possible. Quelque chose doit changer, que ce soit l'URL ou l'action/modèles. Étant donné que l'URL est l'interface publique, je suggère de créer un modèle de vue pour correspondre à cette URL, puis vous pouvez mapper sur le modèle souhaité à partir de là. Par exemple:

public class FilterViewModel 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public string CompanyName { get; set; } 
    public string JobTitle { get; set; } 
} 

Puis:

public ActionResult Search(FilterViewModel model) 
{ 
    var filter = new FilterModel 
    { 
     Person = new FilterPersonModel 
     { 
      Name = model.Name, 
      Age = model.Age 
     }, 
     Job = new FilterJobModel 
     { 
      CompanyName = model.CompanyName, 
      JobTitle = model.JobTitle 
     } 
    }; 

    // do whatever with `filter` 
} 
+0

Voilà ce que je ferais. L'alternative serait la liaison de modèles personnalisés, mais c'est inutilement complexe pour une solution aussi simple. – BgrWorker

+0

Créer ce "bastard" viewModel semble être la possibilité la plus facile. Merci –